在Python中捕獲finally語句中異常訊息
finally
語句用於定義無論是否發生異常都必須執行的程式碼塊。正常情況下,
finally
語句不會捕獲異常,而是在異常處理完成後執行。如果這時候
finally
語句中發生了異常,它會覆蓋之前的異常,併成為最終的異常。要捕獲
finally
語句中的異常訊息,可以使用
try
和
except
語句包裹
finally
1、問題背景
在 Python 中,如果需要捕獲異常並列印所返回的訊息,可以像這樣:
class SelfDefinedException( Exception): pass
try:
message = "Hello World!"
raise SelfDefinedException( message)
except MyDefinedException, e:
print "MyDefinedException", e
但這隻有在
try
語句中才有效。那麼,如何在
finally
子句中捕獲和列印資訊呢?
class SelfDefinedException( Exception): pass
try:
message = "Hello World!"
raise SelfDefinedException( message)
except MyDefinedException, e:
print "MyDefinedException", e
finally:
# What goes here? So I can see what went wrong?
從一些答案中可以得知,這是不可能的。那麼,如果像這樣呢?
class SelfDefinedException( Exception): pass
try:
message = "Hello World!"
raise SelfDefinedException( message)
except MyDefinedException, e:
print "MyDefinedException", e
except Exception, e:
# Hopefully catches all messages except for the one of MyDefinedException
print "Unexpected Exception raised:", e
2、解決方案
根據Python檔案,你不能在
finally
子句中訪問異常資訊。因此最好在
except
子句中進行檢查。
所以,如果需要捕獲所有內容,可以使用:
try:
foo()
except:
print sys. exc_info()
raise
但是這樣做幾乎總是錯誤的。因為如果你不知道發生了哪種異常,就無法對其採取任何措施。此時,程式應該關閉並提供儘可能多的關於問題的資訊。
當然,也有一些方法可以實現捕獲
finally
子句中的異常訊息。
例如,建立一個布林變數
caught_exception
,並在
try
語句中對其賦值為
None
,並在
finally
中檢查其值。如果該值不為
None
,則說明發生了異常,此時可以獲取異常訊息並重新丟擲。
caught_exception = None
try:
x = 10 / 0
#return my_function()
except Exception as e:
caught_exception = e
finally:
if caught_exception:
#Do stuff when exception
raise # re-raise exception
print "No exception"
或者,可以使用
logging
模組將異常訊息記錄到日誌檔案中,這樣就可以在以後進行檢視。
import logging
try:
# Do something that might raise an exception
except Exception as e:
logging. exception( "An error occurred:")
finally:
# Do something whether an exception occurred or not
程式碼例子:
# Define a custom exception
class MyException( Exception):
def __init__( self, message):
self. message = message
# Create a function that raises an exception
def my_function():
raise MyException( "This is an exception message")
try:
my_function()
except MyException as e:
print( f"Caught exception: { e. message} ")
finally:
print( "This will always be printed, regardless of whether an exception was raised or not.")
在這個例子中,
try
語句塊中呼叫了
my_function()
函式,該函式會引發
MyException
。
except
語句塊捕獲了這個異常,並列印了異常訊息。
finally
語句塊在
try
語句塊和
except
語句塊之後執行,無論是否發生了異常,它都會被執行。
總體來說,想要捕獲
finally
塊中的異常訊息,這就需要我們在
finally
塊內使用另一個
try
和
except
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3006761/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在 C++ 中捕獲 Python 異常C++Python
- python中如何捕獲異常Python
- python異常捕獲Python
- 捕獲 React 異常React
- 異常及捕獲
- 你真的會在async/await中捕獲異常嗎?AI
- 儲存過程——異常捕獲&列印異常資訊儲存過程
- python異常處理中finally的作用Python
- android 異常捕獲-UncaughtExceptionHandlerAndroidException
- pb呼叫ole異常捕獲
- 記錄Javascript 異常捕獲JavaScript
- wpf 捕獲全域性異常
- Task異常捕獲的方式
- python之異常捕獲&清除的列印報錯行Python
- 【求助】如何捕獲 pytest parametrize 中的 timeout 異常
- 前端開發中的Error以及異常捕獲前端Error
- SpringBoot之全域性捕獲異常Spring Boot
- 10. 異常捕獲、生成式
- Auth 授權的異常捕獲
- JS 使用try catch捕獲異常JS
- DRF之異常捕獲原始碼分析原始碼
- 捕獲不到異常嘗試除以0
- spring-boot 統一異常捕獲Springboot
- 中介軟體中丟擲異常,Handler中無法捕獲
- Java開發者的Python快速進修指南:異常捕獲JavaPython
- 前端JavaScript 常見的報錯及異常捕獲前端JavaScript
- 異常處理機制(二)之異常處理與捕獲
- 談談前端異常捕獲與上報前端
- 【Spring Cloud】Feign呼叫異常觸發降級後如何捕獲異常SpringCloud
- Auto.js Pro 資料獲取 與 異常捕獲JS
- Java捕獲非檢查異常----UncaughtExceptionHandler的使用JavaException
- 【轉】java中異常與try catch finally詳解Java
- 何時需要對 async/await 進行異常捕獲AI
- Flutter異常捕獲和Crash崩潰日誌收集Flutter
- 記錄使用 guzzlehttp 異常捕獲踩坑記錄HTTP
- Feign失敗重試與全域性異常捕獲
- IOS系統閃退異常(Crash)捕獲處理iOS
- 全網最適合入門的物件導向程式設計教程:27 異常捕獲-Python中異常層級與自定義異常類的實現物件程式設計Python