1

を失敗した場合、ときに私は、単純な例外クラスを持っている:Pythonの例外文が

class Error(Exception): 
    def __init__(self, msg): 
     self.msg = msg 
    def __str__(self): 
     return self.msg 

また、私は失敗したものに応じて異なる例外をスローしたい文の場合があります。

if not self.active: 
    if len(self.recording) > index: 
     # something 
    else: 
     raise Error("failed because index not in bounds") 
else: 
    raise Error("failed because the object is not active") 

これは十分に動作しますが、この単純な(多分それは私だけです)乱雑に見える何かのためif Sを入れ子になった...私はむしろ

if not self.active and len(self.recording) > index: 

のようなものを持っているし、次に投げるでしょうどのように失敗したかに基づいて例外が発生します。

これは可能でしょうか? if(最初の例では)この問題を解決する方法が「最良」に入れ子になっていますか?

ありがとうございます!

**私は、Python 2.7が必要です使用していますいくつかのライブラリは、それゆえ、コードがネストされたif秒の夫婦のみ2.7

+0

詳細を知りたい場合メッセージを送信し、複数のifが行く方法です。それぞれの「もし」は独特のものを生み出します。 – tdelaney

+0

守備的なアプローチを使用してください! – Shasha99

答えて

2

のためである私には完全に罰金を見...

しかし、あなたはおそらく可能性このようなelifを使用します。self.activeFalseと評価さ

if not self.active: 
    raise Error("failed because the object is not active") 
elif len(self.recording) <= index: 
    # The interpreter will enter this block if self.active evaluates to True 
    # AND index is bigger or equal than len(self.recording), which is when you 
    # raise the bounds Error 
    raise Error("failed because index not in bounds") 
else: 
    # something 

場合は、オブジェクトがアクティブでないため、あなたがエラーを取得することがあります。それがアクティブで、長さがself.recordingの場合、インデックスの2番目のエラーが境界外であり、それ以外の場合はすべて正常ですので、安全に実行できます。# something

EDIT:正しく彼のコメントで指摘

@tdelaneyとして、あなたはExceptionを上げるとき、あなたは現在のスコープを終了するので、あなたも、elifを必要としないので、これは実行する必要があります。

if not self.active: 
    raise Error("failed because the object is not active") 
if len(self.recording) <= index: 
    raise Error("failed because index not in bounds") 
# something 
+2

この場合、 'if'は無条件に例外を発生させるので、' elif'か 'if'が後に続くかどうかは関係ありません。 – tdelaney

+1

そんなに真実、@tdelaney !!非常に正しい、非常に正しい! **: - )**私は答えを編集しました!ありがとうございました – BorrajaX

+1

例外を呼び出すために 'if'を逆にして、ネストされているものがないようにすることさえ考えませんでした。シンプルで、華麗で、ネスティングはありません。私はそれが好きです!あなたがた両方に感謝します! – BrandonM