Python 简明教程

Python - Raising Exceptions

Raising Exceptions in Python

在 Python 中,您可以使用 raise 语句显式引发异常。引发异常使您能够指示出现了错误并通过适当处理这些异常来来控制程序的流程。

引发异常是指在您的程序中显式触发一个错误条件。对于由于错误或意外情况而导致您的程序正常流程无法继续的情况,这很有用。

在 Python 中,您可以引发内置的异常(例如 ValueError 或 TypeError)来指示常见的错误条件。此外,您还可以创建并引发自定义异常。

Raising Built-in Exceptions

您可以通过创建异常类的实例并使用 raise 语句引发任何内置异常。以下是语法 -

raise Exception("This is a general exception")

Example

这是一个示例,其中当一个函数接收到一个无效参数时,我们引发一个 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

Raising Custom Exceptions

除了内置异常之外,您还可以通过创建一个新的异常类并继承自基础异常类或其任何子类来定义并引发您自己的自定义异常 -

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

Creating Custom Exceptions

自定义异常对于处理特定于您应用程序的特定错误条件很有用,可提供更精确的错误报告和控制。

要在 Python 中创建自定义异常,您需要定义一个从内置 Exception 类或任何其他适当的内置异常类继承的新类。此自定义异常类可以具有其他属性和方法,以提供有关错误条件的更详细的上下文。

Example

在此示例中 -

  1. 我们定义了一个从“异常”继承的自定义异常类“InvalidAgeError”。

  2. init() 方法使用无效的年龄和默认错误消息初始化异常。

  3. 如果提供的年龄超出有效范围, 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

Re-Raising Exceptions

有时,您可能需要捕获一个异常,执行特定操作(例如记录、清理或提供其他上下文),然后重新引发相同的异常以供调用栈进一步处理。

当您想确保在异常发生时执行某些操作,但仍然允许异常传播以用于更高级别的处理时,这很有用。

要在 Python 中重新引发异常,您需要使用不指定异常的“raise”语句,这将重新引发当前作用域中活动的最后一个异常。

Example

在以下示例中 -

  1. process_file() 函数尝试打开并读取一个文件。

  2. 如果未找到该文件,它会打印一个错误信息并重新引发“FileNotFoundError”异常。

  3. 然后在调用堆栈的更高层级捕获异常并处理它。

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