我在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'
答案 0 :(得分:13)
Python不允许您重新输入失败的块。相反,您可以创建嵌套的try
块:
try:
print "before"
try:
print d['not-exist']
except KeyError:
pass
print "after"
except OtherError:
print "OtherError"
请注意,您经常可以使用KeyError
来避免.get
:
try:
x = d['key']
except KeyError:
x = 0
相当于
x = d.get('key', 0)
通常,尽量使try
块尽可能短,这样您就有更好的机会以适当的本地化方式处理错误。
答案 1 :(得分:4)
python支持finally
块,即使try块中存在异常,也会执行这些块:
try:
print "entering try block"
print this_var_does_not_exists
except:
pass
finally:
print "past exception"
答案 2 :(得分:3)
你也可以在try / except块中使用'else':
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)
打印:
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
通常,完整的try/except/else/final设置如下:
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()
答案 3 :(得分:1)
你无法用这种结构来做。您需要将额外的print
移出try
块。 try / except块的工作方式是,如果引发异常,它会跳转到相应的except
块。没有办法回去。如果要继续,则需要将代码放在except或finally
或整个块之后。这是一个例子:
try:
print "entering try block"
print this_var_does_not_exists
finally:
print "past exception"
此外,不要形成使用裸except:
条款的危险习惯,尤其是pass
作为唯一内容。您应该捕获可以处理的异常类型,然后处理它们,而不是盲目地消除所有异常。
答案 4 :(得分:0)
使用文字字符串打印不会引发异常。将try-except仅放在第二个print语句中。
print "entering try block"
try:
print this_var_does_not_exists
except:
pass
print "past exception"
答案 5 :(得分:0)
简单地将它放在try-except块之后
答案 6 :(得分:0)
我可以想象一种情况,实际上执行许多这样的单行try-excepts可能是有用的,而不需要每次都添加try-except块。
假设您有字典d和对象o。对象有三个属性:'a','b'和'c'。字典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,但问题仍然存在。如果你有几十个关键属性映射会发生什么?线条数量迅速增长。
另一种编码方法是生成两个属性和键名表,并使用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
虽然这不是一个很好的编码练习来做这些事情,但这仍然可以解决你的问题。但要谨慎使用它。