1. ホーム
  2. python

Python 特定の例外をキャッチする

2023-09-11 01:40:52

質問

特定の ValueError ではなく、任意の ValueError .

こんな感じでやってみました。

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

しかし、それは SyntaxError: can't assign to literal.

そこで、試してみました。

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

しかし、それは私が避けたいものであっても、例外を発生させます。

どのように解決するのですか?

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")

一般的に、エラーメッセージはあまり頼りにしたくはないでしょう。 もし、あなたが呼び出し可能な macdat を発生させる代わりに ValueErrormacdat を継承した独自の例外を発生させることができます。 ValueError :

class MyValueError(ValueError): pass

では MyValueError をキャッチし、他の ValueError が他のものに捕まるようにする(あるいは捕まらないようにする)。 単純に except ValueError はこのタイプの例外も捕らえるので、この関数からValueErrorsを捕らえるかもしれない他のコードでも同じように動作するはずです。