2012-11-23 5 views
29

ValueErrorだけでなく、特定のValueErrorをキャッチしたい。
私はこのような気にいら試してみました:Python:特定の例外をキャッチ

try: maquina['WPF'] = macdat(ibus, id, 'WPF') 
except: ValueError, 'For STRING = ’WPF’, this machine is not a wind machine.': 
    pass 

をしかし、それはにSyntaxErrorを発生させます:リテラルに割り当てることはできません。

try: maquina['WPF'] = macdat(ibus, id, 'WPF') 
except ValueError, e: 
    if e != 'For STRING = ’WPF’, this machine is not a wind machine.': 
     raise ValueError, e 
しかし、それは私が避けたいものです場合でも、例外が発生します:
は、その後、私は試してみました。

+7

あなたは以下の答えを得ましたが、例外を再発生させるときは、単にそれ自体で 'raise'を使用してください:例外が処理されない場合でも、元のスタックバックトレースを取得します再提起。 – Duncan

答えて

37

except ValueError,eの場合、eは文字列ではなく例外のインスタンスです。したがって、eが特定の文字列と等しくないかどうかをテストすると、そのテストは常にFalseになります。試してください:

if str(e) != "..." 

例:

def catch(msg): 
    try: 
     raise ValueError(msg) 
    except ValueError as e: # as e syntax added in ~python2.5 
     if str(e) != "foo": 
      raise 
     else: 
      print("caught!") 

catch("foo") 
catch("bar") 

は通常、あなたが本当にあなたがそれを助けることができる場合は、エラーメッセージに依存したくない - それはちょっとあまりにも壊れやすいです。次に、あなただけMyValueErrorをキャッチし、他のValueError sが彼らの方法で継続させることができ

class MyValueError(ValueError): pass 

:あなたが呼び出し可能macdatを管理している場合は、代わりにmacdatValueErrorを上げ、あなたはValueErrorから継承するカスタム例外を上げることができます他の何かに捕まえる(またはしない)。単純なexcept ValueErrorでもこのタイプの例外をキャッチするので、この関数からValueErrorsをキャッチしている他のコードでも同じように動作するはずです。

+0

これは私が欲しいものです。あなたの助けと提案に感謝します。 –

+1

Python 3では 'Exception.message'属性がなくなりました。答えを反映させるために答えを更新し、代わりに(例えば' str(e) ')を提案できますか?この質問は、この種の質問のための正式な複製です。 – vaultah

+1

@vaultah - ありがとうございます。私は更新しました。 – mgilson

3

最後のものの方法は正しいですが、なぜそれが動作しないかを見るためにはrepr(e)を出力してください。

ただし、例外情報が正しいようにするには、(今のように)新しい例外を発生させず、同じ例外を発生させるべきです。そうでなければ、コードをキャッチするコードが増えるか、キャッチされなかった場合はエラーメッセージが表示され、元のソースであるはずのコードがソースとして表示されます。

これを行うには、引数なしでraiseを使用します(exceptブロック内ではもちろん、そうでなければ "現在の"例外はありません)。