簡體   English   中英

在“嘗試”中的“提高”,何時以及如何使用“提高”?

[英]'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塊由於異常冒泡而執行,並引發其自身的異常,則它要么:

  1. 在Python 2上,替換現有的異常
  2. 在Python 3上,它將現有的異常包裝在新的異常中(創建了一系列異常,其中最外面的一個是被檢查的異常,但是內部異常存在於上下文中)

您的其他代碼將打印回溯,因為您根本沒有捕獲到引發的第二個異常(並且繞過了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM