在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
- python動態捕獲異常Python
- 捕獲 React 異常React
- iOS異常捕獲iOS
- 你真的會在async/await中捕獲異常嗎?AI
- java中如何捕獲鍵盤訊息Java
- android 異常捕獲-UncaughtExceptionHandlerAndroidException
- 記錄Javascript 異常捕獲JavaScript
- PHP使用trycatch,捕獲異常PHP
- 【筆記】forall 異常捕獲筆記
- 前端異常捕獲與上報前端
- PLSQL宣告部分異常捕獲SQL
- wpf 捕獲全域性異常
- python異常處理中finally的作用Python
- 在 docker 容器中捕獲訊號Docker
- 前端開發中的Error以及異常捕獲前端Error
- 儲存過程——異常捕獲&列印異常資訊儲存過程
- JS 使用try catch捕獲異常JS
- Auth 授權的異常捕獲
- 異常的捕獲及處理
- oracle異常捕獲程式碼(轉)Oracle
- 10. 異常捕獲、生成式
- MySQL儲存過程中捕獲異常的方法MySql儲存過程
- Java開發者的Python快速進修指南:異常捕獲JavaPython
- python之異常捕獲&清除的列印報錯行Python
- 中介軟體中丟擲異常,Handler中無法捕獲
- 談談前端異常捕獲與上報前端
- DRF之異常捕獲原始碼分析原始碼
- 捕獲不到異常嘗試除以0
- 【求助】如何捕獲 pytest parametrize 中的 timeout 異常
- 前端JavaScript 常見的報錯及異常捕獲前端JavaScript
- 異常處理機制(二)之異常處理與捕獲
- spring-boot 統一異常捕獲Springboot
- SpringBoot之全域性捕獲異常Spring Boot
- iOS 日誌重定向和異常捕獲iOS
- C#中有關異常的捕獲演示C#