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
广告