Pythonの組み込み例外の小話

Event:

みんなのPython勉強会#112

Presented:

2025/02/13 nikkie

お前、誰よ

  • nikkie / みんなのPython勉強会 スタッフ・4代目LT王子

  • 機械学習エンジニア・LLM・自然言語処理(We're hiring!

  • ブログ 連続 810 日突破

../_images/uzabase-white-logo.png

Pythonの 組み込み例外 の小話

毎日書いてるブログ記事からご紹介

例外を出力するように実装

try:
    外部との通信処理()
except Exception as ex:
    print(f"エラー発生: {ex}")

どのような具体の例外が送出されるか不明なので様子を見ていた

よっしゃ、どんなエラーか知るぞ!

エラー発生:
  • エラーの情報が分からない😱

  • 俺みたいになるな!というLTです

📌 {ex!r} にしています

try:
    外部との通信処理()
except Exception as ex:
    print(f"エラー発生: {ex!r}")

例外におすすめ!

{ex!r} とはなにか

  • 変換 (Conversion)なるもの(2.4.3. f-strings

    変換 '!s'str() を、 '!r'repr() を、(略) 呼び出します。

  • 変換を書かないときは !s

返す文字列には違いがある

str():

人間が読める表現

repr():

Python処理系 が読める表現

参考 7.1. 出力を見やすくフォーマットする

引数を渡さない例外とf-strings

>>> ex = Exception()
>>> print(f"{ex}")

>>> print(f"{ex!r}")
Exception()

基底クラス BaseException

このクラスのインスタンスに str() が呼ばれた場合、インスタンスへの引数の表現か、 引数が無い場合には空文字列 が返されます。

(強調は引用者による)

HTTPクライアント HTTPX にて

class ReadTimeout(TimeoutException):
    """
    Timed out while receiving data from the host.
    """

参考: ReadTimeout の継承関係

* HTTPError
  x RequestError
    + TransportError
      - TimeoutException
        · ReadTimeout

元のブログ記事

Pythonで例外を文字列中に出力するときは、str()ではなくてrepr()に渡すのがオススメです

まとめ🌯 f-stringsでは {ex!r}

  • try ... except で例外を捕捉し出力するような場合

  • 例外は引数がないと f"{ex}" すなわち str() は空文字列

  • f"{ex!r}"repr() を呼び出すことで、 引数がない例外でもクラス名が表示される

One more 小話: except Exception:

Pythonで例外を捕捉するときに、except:やexcept BaseException:と書いてはいけません。except Exception:またはもっと具体な例外クラスを指定しましょう

その2までLTには盛り込めませんでした🙏

ご清聴ありがとうございました

Happy ショコラブル*イブ 🍫🔵