パラメーターなしの例外の定義:
class MyException(Exception):
pass
提起された場合、以下の間に違いはありますか:
raise MyException
と
raise MyException()
何も見つかりませんでした。それは単にオーバーロードされた構文ですか?
raise MyException
簡単に言えば、との両方raise MyException()
が同じことをするということです。この最初のフォームは、例外を自動的にインスタンス化します。
ドキュメントの関連セクションには次のように記載されています。
raiseは、最初の式を例外オブジェクトとして評価します。これは BaseException のサブクラスまたはインスタンスである必要があります。クラスの場合、引数なしでクラスをインスタンス化することにより、必要に応じて例外インスタンスが取得されます。
つまり、セマンティクスは同じですが、最初の形式は微視的に高速であり、2 番目の形式はより柔軟です (必要に応じて引数を渡すことができるため)。
ほとんどの人が Python (つまり、標準ライブラリ、一般的なアプリケーション、および多くの本) で使用する通常のスタイルはraise MyException
、引数がない場合に使用することです。いくつかの引数を渡す必要がある場合にのみ、例外を直接インスタンス化します。例: raise KeyError(badkey)
.