コード
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 サーバーに何らかの障害が発生している
こればかりはサーバー上のコンソールをチェックする他ありません。