2

ブロック内にステートメントのブロックがtry: except KeyError: passあり、例外をスローする行の後で Python にコードを実行させる方法を知りたいと思っていました。

例えば

try:
  print "entering try block"
  print this_var_does_not_exists
  print "past exception"
except:
  pass

印刷してみたい"past exception"

上記のコードを実行すると、印刷されるだけです'entering try block'

4

7 に答える 7

15

Python では、失敗したブロックを再入力することはできません。try代わりに、ネストされたブロックを作成できます。

try:
    print "before"
    try:
        print d['not-exist']
    except KeyError:
        pass
    print "after"
except OtherError:
    print "OtherError"

KeyError多くの場合、を使用して s を回避できることに注意してください.get

try:
    x = d['key']
except KeyError:
    x = 0

と同等です

x = d.get('key', 0)

一般tryに、論理的に可能な限り短いブロックを作成するようにしてください。これにより、適切でローカライズされた方法でエラーを処理できる可能性が高くなります。

于 2013-09-29T18:14:59.503 に答える
4

You can also use 'else' to a try/except block:

d={'a':1, 'b':2, 'd':4}

for k in 'abcd':
     try:
        print k, d[k],
     except KeyError:
        print '{} not there'.format(k)
     else:
        print 'I did it! Found {}'.format(k)   

Prints:

a 1 I did it! Found a
b 2 I did it! Found b
c c not there
d 4 I did it! Found d

In general, the full try/except/else/final set go like this:

try:
    potential_error()
except ExceptionType:
    handle_that_error_somehow()
else:                            # 'else' to the except is SUCCESS
    # There was no error
    # handle success!
    handle_success()
finally:
    # success or failure -- do this
    regardless_something_we_always_need_to_do()    
于 2013-09-29T18:19:44.333 に答える
4

Python はfinallyブロックをサポートしており、try ブロックに例外があっても実行されます。

try:
  print "entering try block"
  print this_var_does_not_exists
except:
  pass
finally:
  print "past exception"
于 2013-09-29T18:14:28.023 に答える
1

あの構造では無理です。余分なものをブロックのprint外に移動する必要があります。trytry/except ブロックが機能する方法は、例外が発生した場合に適切なexceptブロックにジャンプすることです。戻る方法はありません。続行したい場合は、コードを except または a に配置するか、finallyブロック全体の後に配置する必要があります。一例を次に示します。

try:
  print "entering try block"
  print this_var_does_not_exists
finally:
  print "past exception"

また、特に唯一のコンテンツとして、むき出しのexcept:句を使用する危険な習慣を形成しないでください。passすべての例外をやみくもに黙らせるのではなく、処理できる種類の例外をキャッチして処理する必要があります。

于 2013-09-29T18:14:28.963 に答える
0

リテラル文字列で印刷しても例外は発生しません。2 番目の print ステートメントだけに try-except を入れます。

print "entering try block"
try:
  print this_var_does_not_exists
except:
    pass
print "past exception"
于 2013-09-29T18:14:20.397 に答える
0

try-except ブロックの後に置くだけです

于 2013-09-29T18:14:24.883 に答える
0

毎回 try-except ブロックを追加する必要なく、このような 1 行の try-excepts を多数実行することが実際に役立つ場合がある状況を想像できます。

辞書 d とオブジェクト o があるとします。オブジェクトには、「a」、「b」、および「c」の 3 つの属性があります。ディクショナリ d は関数 generate_dict() を使用して生成され、「x」、「y」、および「z」のキーを持つ場合がありますが、特定のディクショナリにどのキーが存在するかはわかりません。キー 'x' の値を属性 'a' に、'y' を属性 'b' などに割り当てたい場合、次のように各割り当てを try-catch で囲む必要があります。

o = Object()
d = generate_dict()
try:
    o.a = d['x']
except:
    pass
try:
    o.b = d['y']
except:
    pass

など。 try-excepts を、特定のキーが辞書に存在するかどうかのチェックに置き換えることもできますが、問題はまだあります。何十ものキー属性マッピングがあるとどうなりますか? 行数は急速に増加します。

これをコーディングするもう 1 つの方法は、次のように、属性名とキー名の 2 つのテーブルを生成し、exec 関数を使用してループ内でコードを実行することです。

o = Object()
d = generate_dict()

attributeNames = ['a', 'b', 'c']
dataDictKeys = ['x', 'y', 'z']
for (attr, key) in zip(attributeNames, dataDictKeys):
    try:
        exec("o.{attr} = d['{key}']".format(attr = attr, key = key))
    except:
        pass

これはそのようなことを行うのに適したコーディング方法ではありませんが、それでも問題が解決する可能性があります。ただし、注意して使用してください。

于 2015-08-04T15:42:47.793 に答える