Python - 丟擲異常



在 Python 中引發異常

在 Python 中,您可以使用 raise 語句顯式引發異常。引發異常允許您指示發生了錯誤,並透過適當地處理這些異常來控制程式的流程。

引發異常是指在程式中顯式觸發錯誤條件。這對於處理程式正常流程因錯誤或意外情況而無法繼續的情況非常有用。

在 Python 中,您可以引發內建異常,如 ValueError 或 TypeError,以指示常見的錯誤情況。此外,您還可以建立和引發自定義異常。

引發內建異常

您可以透過建立異常類的例項並使用 raise 語句來引發任何內建異常。以下是語法:

raise Exception("This is a general exception")

示例

以下是一個示例,當函式收到無效引數時引發 ValueError:

def divide(a, b):
   if b == 0:
      raise ValueError("Cannot divide by zero")
   return a / b

try:
   result = divide(10, 0)
except ValueError as e:
   print(e)

以上程式碼的輸出如下:

Cannot divide by zero

引發自定義異常

除了內建異常之外,您還可以透過建立一個新的異常類來定義和引發您自己的自定義異常,該類繼承自基類 Exception 或其任何子類:

class MyCustomError(Exception):
   pass

def risky_function():
   raise MyCustomError("Something went wrong in risky_function")

try:
   risky_function()
except MyCustomError as e:
   print(e)

以上程式碼的輸出如下所示:

Something went wrong in risky_function

建立自定義異常

自定義異常對於處理應用程式特有的特定錯誤條件很有用,可以提供更精確的錯誤報告和控制。

要在 Python 中建立自定義異常,您可以定義一個新類,該類繼承自內建的 Exception 類或任何其他合適的內建異常類。此自定義異常類可以具有其他屬性和方法,以提供有關錯誤條件的更詳細的上下文。

示例

在此示例中:

  • 我們定義了一個自定義異常類 "InvalidAgeError",它繼承自 "Exception"。
  • __init__() 方法使用無效年齡和預設錯誤訊息初始化異常。
  • set_age() 函式如果提供的年齡超出有效範圍,則引發 "InvalidAgeError"。
class InvalidAgeError(Exception):
   def __init__(self, age, message="Age must be between 18 and 100"):
      self.age = age
      self.message = message
      super().__init__(self.message)

def set_age(age):
   if age < 18 or age > 100:
      raise InvalidAgeError(age)
   print(f"Age is set to {age}")

try:
   set_age(150)
except InvalidAgeError as e:
   print(f"Invalid age: {e.age}. {e.message}")

獲得的結果如下所示:

Invalid age: 150. Age must be between 18 and 100

重新引發異常

有時,您可能需要捕獲異常,執行特定操作(例如記錄、清理或提供其他上下文),然後重新引發相同的異常以在呼叫堆疊中進一步處理

當您希望確保在發生異常時採取某些操作,但仍允許異常傳播以進行更高級別的處理時,這很有用。

要在 Python 中重新引發異常,您可以使用 "raise" 語句而不指定異常,這將重新引發當前作用域中最後一個活動的異常。

示例

在以下示例中:

  • process_file() 函式嘗試開啟和讀取檔案。
  • 如果找不到檔案,它會列印錯誤訊息並重新引發 "FileNotFoundError" 異常。

  • 然後,異常會在呼叫棧中更高一層被捕獲並處理。
def process_file(filename):
   try:
      with open(filename, "r") as file:
         data = file.read()
         # Process data
   except FileNotFoundError as e:
      print(f"File not found: {filename}")
    	# Re-raise the exception
      raise  

try:
   process_file("nonexistentfile.txt")
except FileNotFoundError as e:
   print("Handling the exception at a higher level")

執行上述程式碼後,我們將得到以下輸出:

File not found: nonexistentfile.txt
Handling the exception at a higher level
廣告