exception - python スレッド 終了待ち - 現代のPythonでカスタム例外を宣言する適切な方法は?

python thread 強制終了 / python / custom-exceptions

現代の Python でカスタム例外クラスを宣言する適切な方法は何ですか? 私の第一の目標は、他の例外クラスが持っているどんな標準にも従うことで、例えば、私が例外の中に入れた余分な文字列は、例外をキャッチしたどんなツールによっても出力されます。

Python 2.6.2で以下のようなdeprecationの警告につまづいてしまいました。

>>> class MyError(Exception):
...     def __init__(self, message):
...         self.message = message
... 
>>> MyError("foo")
_sandbox.py:3: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6

Marco



Answer #1

Python 3.8(2018、https://docs.python.org/dev/whatsnew/3.8.html)の時点でも、推奨される方法は次のとおりです。

class CustomExceptionName(Exception):
    """Exception raised when very uncommon things happen"""
    pass

必要であれば、より多くのデータを持つ例外的な場合には、この方法がお勧めです。

class CustomExceptionName(Exception):
    """Still an exception raised when uncommon things happen"""
    def __init__(self, message, payload=None):
        self.message = message
        self.payload = payload #さらに引数を追加できます
    def __str__(self):
        return str(self.message) #__ str __()は明らかに文字列が返されることを期待しているため、他のデータ型を送信しないように注意してください

といった感じでフェッチします。

try:
    raise CustomExceptionName("Very bad mistake.", "Forgot upgrading from Python 1")
except CustomExceptionName as error:
    print(str(error)) #非常に悪い間違い
    print("Detail: {}".format(error.payload)) #詳細:Python1からのアップグレードを忘れた