2011-09-21 6 views
3

からNotReadyExceptionを導出するのが最も適切であろうstandard exceptionsのどの、私は今オブジェクトが正しい状態ではありません。どの例外が適切ですか?

class Rocket(object): 
    def __init__(self): 
     self.ready = False 

    def prepare_for_takeoff(self): 
     self.ready = True 

    def takeoff(self): 
     if not self.ready: 
      raise NotReadyException("not ready!") 
     print("Liftoff!") 

を持って言いますか? selfの状態/値が間違っているため、ValueErrorになりますか?

答えて

6

Now, which of the standard exceptions would be most appropriate to derive NotReadyException from?

Exception

何かを台無しにしないでください。

http://code.google.com/p/soc/wiki/PythonStyleGuide#Exceptions

例外処理のためのあなたのユースケースは何ですか?

たとえば、ValueErrorから例外を導いた場合は、except ValueError:を使用して両方の例外をキャッチし、まったく同じ方法で処理するハンドラを記述しますか?ありそうもない。

ValueErrorは、より具体的な例外が適切でない場合にキャッチオールです。あなたの例外は非常に特殊です。

このようなアプリケーション固有の例外がある場合、組み込み例外を持つ有用なセマンティクスを共有する可能性は低くなります。実際に新しいものと既存の例外を1つのハンドラに組み合わせる可能性は非常に低いです。

アプリケーション固有の例外と一般的な例外を組み合わせるのは、一部のキャッチオールロガーでexcept Exception:を使用することだけです。

+0

私の使用例は、何らかの組み込み例外をスローするようにインターフェイスを文書化することを主にお勧めしますが、実際にサブタイプをスローする自由を持っているので、必要が生じたときに「個人的に」より細かく処理できます。あなたのアドバイスはまだ適用されますか?私はライブラリ固有の例外クラスでインターフェイスを混乱させたくありません。 –

+0

@larsmans:標準的なアドバイスは、外部APIの目的で、モジュール内のアプリケーション固有の例外の1つです。多くの場合、 "Error"のような総称名であるため、クライアントはexcept module.Error: 'を実行できます。 –

+0

@larsmans:ドキュメントのユースケースは重要ではありません。処理のためのユースケースが指標です。あなたの例外と 'ValueError' **を同じように処理しない場合、それらは同じことではありません。クラス定義は構造と動作をカプセル化します。例外構造は通常は面白くありません。例外的な動作は興味深い使用事例です。そしてそれは他の何よりも「例外」条項に沸き立つ。 –

2

私はちょうどExceptionから派生しました。 ValueErrorをキャッチしたプログラマは、あなたのNotReadyExceptionもキャッチするとかなり驚くかもしれません。

多くの類似する州別の例外を定義していて、それらをすべて捕まえるのが便利な場合は、StateError例外を定義してからNotReadyExceptionを導出することができます。

+0

...「ValueError」を投げていると書かなければならないのですが、そうですか? –

+2

私は暮らしのための文書を書いていますが、誰もそれを読んだことはほとんどありません。 :-)「最小の驚きの原則」には読書文書は含まれていません。 – kindall

関連する問題