パラメータなしの例外の定義:
class MyException(Exception):
pass
発生した場合、次のような違いはありますか?
raise MyException
そして
raise MyException()
何も見つかりませんでした。それは単にオーバーロードされた構文ですか?
パラメータなしの例外の定義:
class MyException(Exception):
pass
発生した場合、次のような違いはありますか?
raise MyException
そして
raise MyException()
何も見つかりませんでした。それは単にオーバーロードされた構文ですか?
回答:
簡単に言えば、どちらも同じことraise MyException
をraise MyException()
行うということです。この最初のフォームは、例外を自動的にインスタンス化します。
ドキュメントの関連セクションでは、「raiseは最初の式を例外オブジェクトとして評価します。これはサブクラスまたはBaseExceptionのインスタンスのいずれかである必要があります。クラスの場合、必要に応じてクラスをインスタンス化して例外インスタンスを取得します。引数なし。」
つまり、セマンティクスは同じですが、最初の形式は微視的に高速で、2番目の形式はより柔軟です(必要に応じて引数を渡すことができるため)。
ほとんどの人がPythonで(つまり、標準ライブラリ、一般的なアプリケーション、および多くの本で)使用する通常のスタイルraise MyException
は、引数がない場合に使用するスタイルです。引数を渡す必要がある場合にのみ、例外を直接インスタンス化します。次に例を示します raise KeyError(badkey)
。
見に行くためのドキュメントraise
文を。のインスタンスを作成していますMyException
。
raise
がPython 3で少し変更されたことは注目に値します。この質問に関連する部分は同じです(ただしraise ExceptionType
、引数なしでコンストラクターを呼び出すことで型のインスタンスを作成します)。
はい、違いがあります ValueError
ありますValueError()
ValueError
クラスですが ValueError()
のインスタンスを作成します。これが理由であるtype(ValueError) is type
とtype(ValueError()) is ValueError
の唯一の目的 raise
、例外を発生させることです、
私たちが使うとき
ValueError
、クラスが呼び出され、コンストラクタが実行されますValueError()
を使用する
ValueError()
場合、メソッドValueError()
が直接呼び出されます。
注意: raise ValueError # shorthand for 'raise ValueError()'