2014-01-21 61 views
0

我想找到一種方法來獲取我在異常發生前分配的變量。 E.G如果代碼是當發生異常時獲取賦值變量,python異常處理

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

而在 「E = F,」 我仍然希望有一個= b和c = d

生成異常是否有可能?我意識到我可以做出這種多次嘗試的聲明,但有什麼我可以做的一步?

+0

例外,纔會引發其中的代碼中斷。你不能在它之前或之後獲得代碼的信息。 – aIKid

+0

你好。你是什​​麼意思與_「我仍然想要a = b和c = d」_?請更具體說明請 – eyquem

+0

如果該代碼跑了,a和c應該存在... – mhlester

回答

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

print a, C# prints "foo bar" 

兩個ac設置,你可以簡單地使用他們的價值觀異常被處理後。 e未設置爲任何值,因爲執行該行時引發了異常。

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會立即退出。這意味着只有在之後的代碼引發異常的行纔會被忽略。

+0

但是這沒有實際價值,因爲你不知道異常是在哪裏發生的。如果您試圖從所有3個表達式中捕獲異常,並且想知道它在哪裏引發,則需要使用3個try ... except塊。 –

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) 
0

這是一個直截了當的方法,沒有太多的麻煩。當你無法預測可能發生什麼類型的錯誤,或者可能發生多個錯誤時,這是​​最好的出路。

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

您可以做的最好的做法是限制try塊內的表達式數量。

如果需要知道在哪裏異常升高時,你可能會更好使用過多個try...except就像你在queestion提到,由於沒有(實用)的方式來知道哪裏有異常發生。

如果表達式是同一類型的,你可能希望把他們在名單雖然和環比他們,如:

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