python try:except:pass;在多行尝试语句

时间:2013-09-29 18:12:11

标签: python exception-handling

我在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'

7 个答案:

答案 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

虽然这不是一个很好的编码练习来做这些事情,但这仍然可以解决你的问题。但要谨慎使用它。