我想找到一種方法來獲取我在異常發生前分配的變量。 E.G如果代碼是當發生異常時獲取賦值變量,python異常處理
try:
a=b
c=d
e=f
except:
bla bla
而在 「E = F,」 我仍然希望有一個= b和c = d
生成異常是否有可能?我意識到我可以做出這種多次嘗試的聲明,但有什麼我可以做的一步?
我想找到一種方法來獲取我在異常發生前分配的變量。 E.G如果代碼是當發生異常時獲取賦值變量,python異常處理
try:
a=b
c=d
e=f
except:
bla bla
而在 「E = F,」 我仍然希望有一個= b和c = d
生成異常是否有可能?我意識到我可以做出這種多次嘗試的聲明,但有什麼我可以做的一步?
try:
a = "foo"
c = "bar"
e = unknown_function()
except:
pass
print a, C# prints "foo bar"
兩個a
和c
設置,你可以簡單地使用他們的價值觀異常被處理後。 e
未設置爲任何值,因爲執行該行時引發了異常。
是的,這是完全可能的。下面是一個演示:
>>> 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會立即退出。這意味着只有在之後的代碼引發異常的行纔會被忽略。
但是這沒有實際價值,因爲你不知道異常是在哪裏發生的。如果您試圖從所有3個表達式中捕獲異常,並且想知道它在哪裏引發,則需要使用3個try ... except塊。 –
如果我理解正確,這將默認發生。引發一個異常並不會奇蹟般地取消try塊內已經發生的所有事情。在您的示例中,如果e
的分配發生錯誤,則a
和c
仍將具有分配的值。
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)
這是一個直截了當的方法,沒有太多的麻煩。當你無法預測可能發生什麼類型的錯誤,或者可能發生多個錯誤時,這是最好的出路。
try :
a=10
except :
print "bla A"
try :
b=20
except:
print "bla B"
try:
c=d
except :
print "bla C"
您可以做的最好的做法是限制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
難道這樣的事情,你想要什麼?
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
例外,纔會引發其中的代碼中斷。你不能在它之前或之後獲得代碼的信息。 – aIKid
你好。你是什麼意思與_「我仍然想要a = b和c = d」_?請更具體說明請 – eyquem
如果該代碼跑了,a和c應該存在... – mhlester