0
Help us understand the problem. What are the problem?

posted at

updated at

[備忘録]サーバー上で起こった例外をまるごとハンドリングしてDiscordに送る

コード

main.py
import json
import os
import traceback
from urllib import request
import dotenv
dotenv.load_dotenv()

DC_WEBHOOK_URL = os.getenv('DC_WEBHOOK_URL')

def standalone_discord_traceback_messenger(): # もっと良いネーミング募集中
    req = request.Request(
        url=DC_WEBHOOK_URL,
        headers={'User-Agent': '', 'Content-Type': 'application/json'}
    )

    data = {
        'content': '',
        'embeds': [{
            'type': 'rich',
            'title': traceback.format_exc(0)[:-1],
            'description': '```\n' + traceback.format_exc() + '\n```',
            'color': 0xDD3333 # 優しい赤
        }]
    }

    request.urlopen(req, data=json.dumps(data).encode())

def main():
    # ~~~すべての処理~~~
    three = 1 + 1

if __name__ == "__main__":
    try:
        main()
    except:
        standalone_discord_traceback_messenger()
        raise

補足

13行目 headers['User-Agent'] = ''

urllib.request では明示的に User-Agent を空にしないと 'User-Agent' = 'Python-urllib/3.9' となり、これは Discord 側で弾かれる。

20行目 traceback.format_exc(0)[:-1]

traceback.format_exc の第一引数はトレースバックの上限。0 にすると最初の一行 HogeError: fuga message だけ表示される。しかし traceback の仕様(たぶん)で最後に \n が入るので、[:-1] で一文字削っている。

21行目 'description': '```\n' + traceback.format_exc() + '\n```'

Discord の md っぽい仕様のおかげで ``` で囲むことでコード扱い、つまり等幅フォントになる。例外が見やすい。

35行目 except:

例外の種類を指定 (except HogeError as err:) せず、すべての例外を取得することはしない方が良いって聞いたことあるけど... (次に続く)

37行目 raise

raise って単体でも使えることを最近知った。これで try: で保留中のすべての例外を raise できるので、例外の種類を指定しないことは問題にならない...はず。


注意

このコードの main() 以外の箇所で例外が発生することは想定されていません。

以下のような例外が考えられます。

  • モジュール dotenv がインストールされていない。
  • 環境変数 DC_WEBHOOK_URL.env またはサーバーの環境変数で定義されていない
  • Discord の Webhook サーバーに何らかの障害が発生している

こればかりはサーバー上のコンソールをチェックする他ありません。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?