在引发异常时获取赋值变量,python异常处理

时间:2014-01-21 02:07:44

标签: python exception

我想找到一种方法来获取我在分配异常之前分配的变量。 E.G如果代码是

try:
  a=b
  c=d
  e=f
except:
  bla bla

在“e = f”处生成异常,我仍然想要a = b和c = d

有可能吗?我意识到我可以制作这个多次尝试语句但是我能在一步中做些什么吗?

6 个答案:

答案 0 :(得分:1)

是的,这是完全可能的。以下是演示:

>>> try:
...     a = 1
...     b = 2
...     c = 1/0 # This will raise a ZeroDivisionError
... except ZeroDivisionError:
...     print 'an error occurred'
...
an error occurred
>>> a  # a still exists
1
>>> b  # so does b
2
>>> c  # only c is undefined
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'c' is not defined
>>>

try/except旨在正常执行try-block中的代码,直到引发异常。发生这种情况时,会立即退出try-block。这意味着只会忽略引发异常的行之后的代码

答案 1 :(得分:0)

try:
  a = "foo"
  c = "bar"
  e = unknown_function()
except:
  pass

print a, c # prints "foo bar"

设置了ac,您可以在处理异常后简单地使用它们的值。 <{1}}未设置为任何内容,因为执行该行时会引发异常。

答案 2 :(得分:0)

如果我理解正确,默认情况下会发生这种情况。提出异常并不会神奇地撤消try块中已经发生的所有事情。在您的示例中,如果在e的分配上发生错误,则ac仍将具有已分配的值。

try:
    a = b
    c = d
    e = f # oh noes! error! Try block skips to the end!
except: pass

print (a) #but a and c are still there
print (c)

答案 3 :(得分:0)

这是一种直接的方法,没有太多的麻烦。当您无法预测可能发生的错误类型或可能发生多个错误时,这是​​最好的解决方法。

try :
    a=10
except :
    print "bla A"
try :
    b=20
except:
    print "bla B"
try:
    c=d
except :
    print "bla C"

答案 4 :(得分:0)

您可以做的最好的事情是限制try块内的表达式数量。

如果您需要知道引发异常的位置,那么您可能最好使用您在问题中提到的多个try...except,因为没有(实际)方式知道引发例外的地方。

如果表达式的类型相同,您可能希望将它们放在列表中,然后循环它们,例如:

vars = [a, b, c]
values = [1, 2, 0]

for i, (var, value) in enumerate(zip(vars, values)):
    try:
        var /= value
    except ZeroDivisionError:
        print 'The exception was raised on the {}. iteration'.format(i)
        continue

答案 5 :(得分:0)

这是你想要的吗?

import sys

code = """
b = 100
d = 200

a=b
c=d
e=10/0
g=e
h = 100
"""

for line in filter(None,code.splitlines()):
    print line
    try:
        exec line
    except:
        sys.excepthook(sys.exc_info()[0],sys.exc_info()[1],None)

结果

b = 100
d = 200
a=b
c=d
e=10/0
ZeroDivisionError: integer division or modulo by zero
g=e
NameError: name 'e' is not defined
h = 100