25

Python では、2 つの方法で例外を発生させることができます

raise ValueError
raise ValueError()

後者の場合に例外メッセージを提供できるという事実を除けば、これら 2 つのスタイルの間に根本的な違いはありますか? どちらかを選択する必要がありますか?

4

2 に答える 2

16

ドキュメントから両方が有効です(予期しない動作はありません):

発生させる唯一の引数は、発生する例外を示します。これは、例外インスタンスまたは例外クラス (Exception から派生したクラス) のいずれかである必要があります。

私の意見では、データを保持したい場合は、それがメッセージ(あなたが言ったように)であろうとカスタムデータであろうと何であろうと、インスタンスを使用する必要があります。

@alko が言ったように、インスタンスを指定しないと、引数なしでインスタンス化されます。

必須の引数が必要な場合、これは機能しません。

>>> class MyError(Exception):
...    def __init__(self, message, data=None):
...       self.msg = message
...       self.data = data or {}
...
>>> raise MyError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() takes at least 2 arguments (1 given)
于 2013-11-04T13:29:04.410 に答える
13

コメントを要約すると、違いはありません。いずれの構文も ValueError インスタンスをスローします。ドキュメントからの関連抜粋:

クラスの場合、引数なしでクラスをインスタンス化することにより、必要に応じて例外インスタンスが取得されます。

于 2013-11-04T13:26:43.963 に答える