110

パラメーターなしの例外の定義:

class MyException(Exception):
    pass

提起された場合、以下の間に違いはありますか:

raise MyException

raise MyException()

何も見つかりませんでした。それは単にオーバーロードされた構文ですか?

4

3 に答える 3

129

raise MyException簡単に言えば、との両方raise MyException()が同じことをするということです。この最初のフォームは、例外を自動的にインスタンス化します。

ドキュメントの関連セクションには次のように記載されています。

raiseは、最初の式を例外オブジェクトとして評価します。これは BaseException のサブクラスまたはインスタンスである必要があります。クラスの場合、引数なしでクラスをインスタンス化することにより、必要に応じて例外インスタンスが取得されます。

つまり、セマンティクスは同じですが、最初の形式は微視的に高速であり、2 番目の形式はより柔軟です (必要に応じて引数を渡すことができるため)。

ほとんどの人が Python (つまり、標準ライブラリ、一般的なアプリケーション、および多くの本) で使用する通常のスタイルはraise MyException、引数がない場合に使用することです。いくつかの引数を渡す必要がある場合にのみ、例外を直接インスタンス化します。例: raise KeyError(badkey).

于 2013-05-23T08:36:33.587 に答える