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"

请注意,您通常可以避免KeyErrors 使用.get

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

相当于

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

一般来说,尽量让你的try块在逻辑上尽可能短,这样你就有更好的机会以适当的、本地化的方式处理错误。

于 2013-09-29T18:14:59.503 回答
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 回答
4

您还可以在 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()    
于 2013-09-29T18:19:44.333 回答
1

你不能用那种结构来做。您需要将多余print的部分移出try块。try/except 块的工作方式是,如果引发异常,它会跳转到适当的except块。没有办法回去了。如果要继续,则需要将代码放在 except 或 afinally中,或者放在整个块之后。这是一个例子:

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

另外,不要养成使用单子except:句的危险习惯,尤其是pass作为唯一内容的子句。你应该捕捉到你能处理的异常类型,然后处理它们,而不是盲目地让所有异常保持沉默。

于 2013-09-29T18:14:28.963 回答
0

使用文字字符串打印不会引发异常。仅将 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-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

虽然这不是一个很好的编码实践来做这些事情,但这仍然可以以某种方式解决你的问题。但请谨慎使用。

于 2015-08-04T15:42:47.793 回答