簡體   English   中英

捕獲已捕獲的異常

[英]Catch an already caught exception

我有一個函數,它既應該獨立運行,又應該由處理某些異常的其他函數使用

def some_function():
    try:
        do_something()
    except SpecificException:
        handle_exception()

我有第二個函數調用第一個函數,但希望在some_function發生時以不同的方式處理此異常:

def different_function():
    try:
        some_function()
    except SpecificException:
        different_handling()

這是可能嗎? 我正在尋找的是一種禁用some_functionexcept的方法,以便different_function中的 try-except 可以捕獲SpecificException

告訴函數some_function不處理異常並將其傳遞

def some_function(handleException=True):
    try:
        do_something()
    except SpecificException:
        if !handleException: raise
        handle_exception()

def different_function():
    try:
        some_function(handleException=False)
    except SpecificException:
        different_handling()

或者為函數some_function要使用的異常處理程序

def some_function(exceptionHandler=handle_exception):
    try:
        do_something()
    except SpecificException:
        exceptionHandler()

def different_function():
    some_function(exceptionHandler=different_handling)

在第一個函數中執行所需的邏輯后,您可以再次重新引發異常。

def some_function():
    try:
        do_something()
    except SpecificException as e:
        handle_exception()
        raise e 

你可以用raise語句重新raise

def some_function():
    try:
        do_something()
    except SpecificException:
        handle_exception()
        raise

正如文檔所說: If no expressions are present, raise re-raises the last exception that was active in the current scope.

我無法准確理解您想說的內容,但是如果您在第一個函數中處理特定異常,則您在第二個函數中編寫的異常將不起作用。 如果這兩個異常彼此不同,例如 FileNotFoundException 和 IOException 將改變情況。 在這種情況下,無論代碼給出哪個錯誤,與之相關的部分都將起作用。 如果問題與此不同,您可以稍微打開問題嗎?

這完全取決於您如何處理第一個功能。 如果您的第一個函數接受錯誤並處理它,那么第二個函數將找不到任何錯誤,因此它將執行。

但是如果你的第一個函數無法處理錯誤,(假設你的第一個函數處理 error_type1,但在運行時它引發了 error_type2),那么第一個函數的異常顯然會失敗,如果該錯誤在第二個函數中得到正確處理,那么沒關系。

我的意思是,如果第一個函數以某種方式引發錯誤,那么第二個函數會捕獲它,否則不會,就這么簡單。 現在,如果您希望在第二個函數中捕獲相同的錯誤,只需在第一個異常中引發錯誤即可。

您的示例是合法的,但讓我們將其拆分為幾個常見案例,以查看我將提供的示例:

def some_function():
    try:
        a = int("a")
    except ValueError:
        print("not convertable")        

def different_function():
    try:
        some_function()
    except Exception as e:
        print(e)

different_function()

輸出:

not convertable

發生了什么?

函數different_functiontry catch語句中調用了some_function ,內部函數現在遇到了在它自己的try catch語句中引發Exception的行,並處理它。 現在 - 異常從未重新引發到外部函數,該函數保持運行而不會遇到錯誤。

這是一個例子,當內部函數知道如何處理異常時。

有時,在現實生活中,內部函數不知道如何自己處理異常,然后向上重新引發異常,如下所示:

def some_function():
    try:
        a = int("a")
    except ValueError as e:
        raise e
        

def different_function():
    try:
        some_function()
    except Exception as e:
        print("I Know how to fix it: " + str(e))

different_function()

輸出:

I Know how to fix it: invalid literal for int() with base 10: 'a'

並按照這個順序,錯誤處理鏈在整個程序中被跟蹤,並在任何可以處理的地方進行處理

最佳實踐是盡可能少地將語句保留在tryexcept中,以免通過它們也遇到異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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