76

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

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

4

3 に答える 3

90

inはexcept ValueError,ee文字列ではなく、例外のインスタンスです。したがって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")

通常、エラー メッセージに頼る必要はありません。エラー メッセージは少し脆弱すぎます。callable を制御できる場合は、 inを発生さmacdatせる代わりに、から継承するカスタム例外を発生させることができます。ValueErrormacdatValueError

class MyValueError(ValueError): pass

次に、キャッチすることしかできずMyValueError、他ValueErrorの s が他の何かにキャッチされるように (またはキャッチされないように) 続行できます。Simpleexcept ValueErrorはこのタイプの例外もキャッチするため、この関数から ValueErrors をキャッチしている可能性のある他のコードでも同じように動作するはずです。

于 2012-11-23T14:43:51.990 に答える
5

最後の方法は正しいです (ただし、repr(e) を印刷して、なぜ機能しないかを確認してください)。

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

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

于 2012-11-23T14:47:50.883 に答える
3

type(e)これには、およびを使用できますe.args。タプルを返し、タプルを自分のものと一致させます。

于 2020-12-17T16:04:19.850 に答える