Pythonで例外をサブクラス化する必要があるのはいつですか?


10

私のコードでは、例外を発生させる場所が約7箇所あります。これらの例外はすべて同じように扱われます。エラーをログファイルに出力し、ソフトウェアの状態をデフォルトに戻して終了します。

コードのレビュー中に、私が高く評価している上級エンジニアは、これらの例外をすべてサブクラス化する必要があると述べました。彼の主張は、将来的には例外を別の方法で処理したいと思うかもしれず、それはより簡単になるでしょう。

私の主張は、現時点ではコードが雑然としているだけであり、例外を別の方法で処理するかどうかがわからないため、コードを簡潔にしておきます。 。

いずれの場合も議論はありますか。


2
YAGNI ...今は必要ありません。後で簡単に追加できます。
Robert Harvey

例はありますか?Exceptionたとえば、単に、またはより具体的な組み込みエラーを発生させていますか?
jonrsharpe 2015年

Exception( "specific description")を上げるだけ
Ezra

@Ezra少なくとも、より適切な組み込み例外があるかどうかを確認する必要があります(docs.python.org/2/library/exceptions.htmlを参照)。
jonrsharpe 2015年

回答:


8

あなたが正しい

あなたの側の議論はすでにRobert Harveyによって言及されています:特に後で簡単に追加できるので、今必要のないコードを追加しないでください。

あなたのレビュアーも正しい

一方、レビューアのポイントも理解できます。

  • ジェネリックを返すException()ことは呼び出し側にとってあまり役に立ちません:例外の説明は何が起こっているのかを人間に示しますが、例外をプログラム的に異なる方法で処理することは不可能かもしれません。コードを使用する開発者は、何かを壊すことの恐怖(正当化されているかどうかにかかわらず)を含め、例外のタイプの変更消極的かもしれません。

    今すぐカスタム例外追加することはそれほど難しくないことに注意しください:

    class MyCustomException(Exception):
        pass
    

    は、あなたが必要とすることすべてです。それはたった2行のコードです(1つのファイルにカスタムの例外を配置する場合、別のファイルを作成する必要がない場合もあります)。

  • コード自体は見やすく、読みやすくなっています。

    if price < self.PriceMinValue:
        raise OutOfRangeException("The price is inferior to zero.")
    

    に比べて少し読みやすく見えます:

    if price < self.PriceMinValue:
        raise Exception("The price is inferior to zero.")
    

    例外のタイプを示すため:

    • コードの2番目の部分では、説明を読んで、価格が範囲外であることを推測する必要があります(そうでない場合もありませんか?リベートなど、価格がマイナスになる可能性がある場合もあります)。

    • コードの最初の部分では、型を一目見ただけで、エラーについてすぐにわかります。価格に許可された値のセットがあり、現在の値がこのセットの外にあるようです。

そう?

そう:

  • どちらの方法も有効です。カスタム型が必要ないときに例外をサブクラス化しない場合は、その通りです。例外をサブクラス化すると、それを実行するのにコストがかからず、後で役立つ可能性があるので、あなたは正しいでしょう。

  • チームと一貫性を保つ。チームでカスタム例外を広範囲に使用している場合は、それらを使用してください。


2
しかし、幸せな媒体がありますraise ValueError('The price is less than zero')。これはbaseよりも具体的ですが、Exception大騒ぎはありません。
jonrsharpe 2015年

「一貫している」という単純なステートメントの+1。チームがある場合はチームで、そうでない場合は自分で。
Styne666 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.