在Python中捕獲finally語句中異常訊息

華科雲商小雪發表於2024-02-19

當我們在使用Python時, finally 語句用於定義無論是否發生異常都必須執行的程式碼塊。正常情況下, finally 語句不會捕獲異常,而是在異常處理完成後執行。如果這時候 finally 語句中發生了異常,它會覆蓋之前的異常,併成為最終的異常。要捕獲 finally 語句中的異常訊息,可以使用 try except 語句包裹 finally 塊。但是具體問題具體對待,具體情況請看我一一解釋。

1、問題背景

在 Python 中,如果需要捕獲異常並列印所返回的訊息,可以像這樣:


class 
SelfDefinedException(
Exception): 
pass


try:
    message  =  "Hello World!"
    raise  SelfDefinedException( message)
except  MyDefinedExceptione:
    print  "MyDefinedException"e

但這隻有在 try 語句中才有效。那麼,如何在 finally 子句中捕獲和列印資訊呢?


class 
SelfDefinedException(
Exception): 
pass


try:
    message  =  "Hello World!"
    raise  SelfDefinedException( message)
except  MyDefinedExceptione:
    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  MyDefinedExceptione:
    print  "MyDefinedException"e
except  Exceptione:
    # 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__( selfmessage):
        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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章