25

カスタムテキストで組み込みの例外を発生させても大丈夫ですか?または、カスタムテキストでも組み込みの警告を表示しますか?

ドキュメントには次のように書かれています。

例外ValueError:組み込みの操作または関数が引数を受け取ったときに発生します(…)

組み込みの操作のみがValueError例外を発生させる必要があることを意味しますか?

実際には、ValueErrorまたはExceptionから継承する例外クラスを作成しても安全であることを理解しています。しかし、それを行わずに、ValueError( "custom text")を直接発生させても大丈夫ですか?

ValueErrorは組み込みであるため、(カスタムテキストを使用して)ValueErrorを発生させると、カスタム例外タイプ(標準ではない「ValueErrorSpecificModule」など)と比較して、ユーザーはどのような問題が関係しているかをすばやく確認できます。

4

3 に答える 3

28

次のようなことを行うことで、操作上問題はありません。

raise ValueError("invalid input encoding")

実際、コードの最初のパスを書いているときに、これを頻繁に行います。そのようにすることの主な問題は、コードのクライアントが例外処理を正確に行うのに苦労することです。その特定の例外をキャッチするには、キャッチした例外オブジェクトに対して文字列照合を行う必要がありますが、これは明らかに壊れやすく、面倒です。したがって、独自のValueErrorサブクラスを導入することをお勧めします。これは、ValueErrorとしてキャッチされる可能性がありますが、より具体的な例外クラスとしてもキャッチされる可能性があります。

一般的な経験則では、次のようなコードがある場合は常に次のようになります。

raise ValueError('some problem: %s' % value)

おそらく次のようなものに置き換える必要があります。

class SomeProblem(ValueError):
    """
    Raised to signal a problem with the specified value.
    """
# ...
raise SomeProblem(value)

例外タイプはがうまくいかなかったかを指定し、メッセージ/属性はどのようにうまくいかなかったかを指定すると言うかもしれません。

于 2010-02-01T23:20:23.127 に答える
3

それは完全に大丈夫です。

ただし、組み込みの例外と区別するために、独自のサブクラスを作成することをお勧めします。

たとえば、のように機能するものdictがある場合、通常の理由でKeyErrorを発生させることができますが、KeyErrorが実際に実装で使用している基になるdictから発生している場合はどうなりますか。

KeyErrorのサブクラスを上げると、実装にバグがあることを簡単に確認できます。キーがオブジェクトにないだけではありません。

于 2010-02-01T22:44:28.413 に答える
3

それは大丈夫です、そして私はいつもそれをします。多くの状況で、MySpecialTypeErrorよりもTypeErrorが表示されるのはそれほど驚くことではありません。

リンクしたページに「組み込み」というフレーズが表示されません。

exception TypeError: Raised when an operation or function is applied to an object of inappropriate type. The associated value is a string giving details about the type mismatch.

おそらく誰かがあなたの質問を見て、すでにドキュメントを修正しました。
編集:ValueError代わりにのドキュメントを挿入したようですTypeError

于 2010-02-01T22:48:45.290 に答える