13

引数なしで例外を発生させるベスト プラクティスを知りたいです。公式のpythonドキュメントでは、これを見ることができます:

try:
    raise KeyboardInterrupt

( http://docs.python.org/tutorial/errors.html章 8.6)

また、Django や Google コードなどのいくつかの異なるコードでは、次のように表示されます。

  def AuthenticateAndRun(self, username, password, args):
    raise NotImplementedError()

( http://code.google.com/p/neatx/source/browse/trunk/neatx/lib/auth.py )

例外は、引数がないときに発生する前にインスタンス化されます。引数なしで例外をインスタンス化する目的は何ですか? 最初のケースまたは2番目のケースをいつ使用する必要がありますか?

前もってありがとうファビアン

4

3 に答える 3

5

お好きな形でお使いいただけます。実際の違いはなく、どちらも Python 2 と 3 で有効です。Python スタイル ガイドでは、どちらが推奨されるかは指定されていません。


「クラスフォーム」のサポートについてもう少し詳しく:

try:
    raise KeyboardInterrupt

この形式は、Python 2 と 3 の両方で完全に合法です。 pep-3109からの抜粋:

raise EXCEPTION は、新しい例外を発生させるために使用されます。このフォームには 2 つのサブバリアントがあります。EXCEPTION は、例外クラスまたは例外クラスのインスタンスの場合があります。有効な例外クラスは、BaseException とそのサブクラスです [5]。EXCEPTION がサブクラスの場合、例外インスタンスを取得するために引数なしで呼び出されます。

Python のドキュメントにも記載されています。

... クラスであれば、引数なしでクラスをインスタンス化することにより、必要なときに例外インスタンスが取得されます。

于 2014-03-05T07:45:45.943 に答える
2

例外インスタンスの代わりに例外クラスを発生させることは非推奨の構文であり、新しいコードでは使用しないでください。

raise Exception, "This is not how to raise an exception..."
于 2010-07-12T12:48:47.167 に答える
0

C ++のような言語では、例外だけでなく、任意のオブジェクトを発生させることができます。Pythonはより制約されています。試してみると:

raise 1

あなたが得る:

Traceback (most recent call last):
...
TypeError: exceptions must be old-style classes or derived from BaseException, not int

Pythonプログラミングモデルでは、通常、インスタンスの代わりにクラスを単独で使用できます(これは、一意のインスタンスをすばやく作成するのに便利です。クラスを定義するだけです)。したがって、例外インスタンスの代わりに例外クラスを発生させることができるのも不思議ではありません。

ただし、Ignacioが言ったように、これは非推奨です。

また、直接の質問ではないいくつかの補足事項:

一部のコードでは、raiseだけを単独で見ることもできます。オブジェクトクラスなどはありません。これは、現在の例外を再発生させるために例外ハンドラーで使用され、最初のトレースバックを保持します。

于 2010-07-12T12:58:44.187 に答える