web-dev-qa-db-ja.com

Python:ValueErrorとExceptionの違いは?

ValueErrorの発生と例外の発生の違いを理解しようとしています。同じコードで(同じブランチでも)両方を試しましたが、結果は同じでした-エラーメッセージが表示されました。

私はSOに関するこの質問について調査しましたが、これに関する議論は見つかりませんでした。次に、例外のドキュメントを読んで、次の definition のValueErrorを見つけました。

組み込みの操作または関数が、適切な型ではあるが不適切な値を持つ引数を受け取り、IndexErrorなどのより正確な例外によって状況が説明されない場合に発生します。

私が理解しているように、例外はより一般的な用語であり、ValueErrorはいくつかの特定の場合に適用できます。しかし、両方の問題を発生させた結果は同じなので、ValueErrorとExceptionを区別する実際的な意味は何かを理解したいと思います。 Pythonバージョンはここでは関係ありません。ありがとうございます!

[〜#〜] edit [〜#〜]:答えてくれたおかげで、try-exceptionコンストラクトの両方の用語の違いは何ですか。しかし、例外ではなく、単に育てる場合の違いは何ですか?

raise Exception('blah') 

そして

raise ValueError('blah') 

@PeterWoodへの回答:どちらの場合も「blah」というエラーメッセージが表示されましたが、ある場合は「Exception:blah」、2番目の場合は「ValueError:blah」でした。この場合、両者の間に実際的な違いはありません。

7
vlad.rad

ValueErrorExceptionから継承します。 ValueErrorのみ、またはExceptionのいずれかをトラップすることを決定できます。これが例外の継承の目的です。

この例では:

try:
    a=12+"xxx"
except Exception:
    # exception is trapped (TypeError)

例外はトラップされ、すべての例外(BaseException例外を除く)はexceptステートメントによってトラップされます。

この他の例では:

try:
    a=12+"xxx"
except ValueError:
    # not trapped

ここでは、例外はトラップされません(TypeErrorValueErrorではなく、継承しません)

通常、特定の例外を使用して、発生する可能性のある例外のみをトラップし(ファイルを処理する場合の最良の例はIOErrorです)、残りはトラップされないままにします。すべての例外をキャッチする危険性は、クラッシュしないが何もしないコードを取得することです。

(あなたの編集に応じて答えを編集します:)例外を発生させるとき:Exceptionのインスタンスを作成し、将来的にexcept ValueError:ステートメント。例外の表現(印刷時)に例外クラス名が含まれているため、メッセージは異なります。

13

あなたは言った、ValueErrorは特定の例外です。短い例:

try:
    print int("hello world")
except ValueError:
    print "A short description for ValueError"

「hello world」をintで変更し、int(42)を出力すると、例外は発生しません。

例外に関するドキュメントはこちら をご覧ください。

1
Nicolas Flores