![](/img/trans.png)
[英]How to catch an exception that was already caught by a nested function call in Python
[英]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_function
的except
的方法,以便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_function
在try
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'
並按照這個順序,錯誤處理鏈在整個程序中被跟蹤,並在任何可以處理的地方進行處理
最佳實踐是盡可能少地將語句保留在try
和except
中,以免通過它們也遇到異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.