21

簡単なコードは次のとおりです。

import sys

class EmptyArgs(StandardError):
    pass

if __name__ == "__main__":
    #first way to raise exception
    if len(sys.argv) == 1:
       raise EmptyArgs     
    #second way to raise exception
    if len(sys.argv) == 1:
       raise EmptyArgs()

「もっと」はどっちが正しい?どちらも機能しています。
注: 私の実際のコードでは、例外は宣言したものとまったく同じです: メッセージと引数はありません。

4

3 に答える 3

30

どちらも適切です。後者の形式では、引数を例外に添付できます。

if len(sys.argv) == 1:
   raise EmptyArgs('Specify at least 1 argument')

raise ステートメントのタプルとして、2 番目の値として引数を渡すこともできます。

if len(sys.argv) == 1:
   raise EmptyArgs, ('Specify at least 1 argument',)

しかし、単一の非タプル値も機能し、単一の引数と見なされます:

if len(sys.argv) == 1:
   raise EmptyArgs, 'Specify at least 1 argument'

raiseコード内の現在の場所に対して生成されるトレースバックの代わりに使用される別のトレースバックを指定するための3 番目の値:

if len(sys.argv) == 1:
   raise EmptyArgs, ('Specify at least 1 argument',), traceback_object

ステートメントのドキュメントを参照してくださいraise

例外に引数を使用する場合、Python スタイルガイド PEP 8では、クラスではなく例外インスタンスを提供することを推奨しています。

例外を発生させるときraise ValueError('message')は、古い形式の代わりに使用しraise ValueError, 'message'ます。

例外引数が長い場合や文字列の書式設定が含まれる場合、括弧が含まれているため、行継続文字を使用する必要がないため、括弧を使用する形式が推奨されます。古い形式は Python 3 で削除されます。

Python 3 では、その形式はサポートされなくなります。

于 2012-10-24T16:00:09.537 に答える
2

引数なしで Exception を発生させることは推奨されません。つまり、例外クラスを発生させることは適切ではありません。このようなことをするだけです

raise MyException()

Python 3.0 では、同様のケースが完全に削除されているためです。

raise Exception, "foo"

それを行う明白な方法が 1 つ (できれば 1 つだけ) ある必要があります。

于 2012-10-24T16:09:04.123 に答える
1

2 つの形式は同等です。どちらも のインスタンスをスローすることになりますEmptyArgsドキュメントから:

最初のオブジェクトがクラスの場合、それが例外の型になります。2 番目のオブジェクトは、例外値を決定するために使用されます。それがクラスのインスタンスである場合、インスタンスは例外値になります。2 番目のオブジェクトがタプルの場合、それはクラス コンストラクターの引数リストとして使用されます。None の場合、空の引数リストが使用され、他のオブジェクトはコンストラクターへの単一の引数として扱われます。コンストラクターを呼び出すことによって作成されたインスタンスは、例外値として使用されます。

上記の「2 番目のオブジェクト」は、次の (オプションの) 2 番目の引数ですraise

raise EmptyArgs, 'Invalid input!'
于 2012-10-24T16:00:23.077 に答える