[英]'raise' inside 'try' , when and how do I use 'raise?
所以這是代碼:
def fancy_divide(list_of_numbers, index):
try:
try:
raise Exception("0")
finally:
denom = list_of_numbers[index]
for i in range(len(list_of_numbers)):
l ist_of_numbers[i] /= denom
except Exception as ex:
print(ex)
如果我打電話給:
fancy_divide([0, 2, 4], 0)
為什么不打印出“ 0”?
如果我這樣編輯代碼:
def fancy_divide(list_of_numbers, index):
try:
try:
raise Exception("0")
finally:
denom = list_of_numbers[index]
for i in range(len(list_of_numbers)):
list_of_numbers[i] /= denom
except Exception as ex:
raise Exception("0")
print(ex)
然后調用同一件事,它會打印:
Traceback (most recent call last):
File "<ipython-input-16-c1b0ac98281c>", line 1, in <module>
fancy_divide([0, 2, 4], 0)
File "/Users/dsn/.spyder-py3/temp.py", line 10, in fancy_divide
raise Exception("0")
Exception: 0
這是為什么 ? 什么時候應該使用加薪的正確方法是什么?
您的finally
塊本身會引發一個異常,即被零除的錯誤(因為分母為0)。 如果finally
塊由於異常冒泡而執行,並引發其自身的異常,則它要么:
您的其他代碼將打印回溯,因為您根本沒有捕獲到引發的第二個異常(並且繞過了print
)。
我建議閱讀異常教程以了解更多信息。 您的示例代碼是如此虛構/毫無意義,無法說出您真正的誤解,以及僅僅是為了說明支持您的問題的特定行為。
def fancy_divide(list_of_numbers, index):
try:
try:
raise Exception("0") # 1
finally:
denom = list_of_numbers[index]
for i in range(len(list_of_numbers)):
list_of_numbers[i] /= denom
except Exception as ex:
print(ex) # 2
注意數字
1.這個東西首先執行觸發第二次try
之外的except
塊而忽略其他塊。
2.由於try
塊中有異常,將觸發此事件。
在except
塊內使用raise可以避免復雜的事情。
我會將您的代碼重寫為:
def fancy_divide(list_of_numbers, index):
try:
# Your fancy divide logic here
except Exception as ex:
raise Exception('Something went wrong: {exception}'.format(exception=ex))
finally:
# Don't need to
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.