Python - 自定义异常



什么是 Python 中的自定义异常?

Python 的自定义异常是用户定义的错误类,扩展了基本 Exception 类。开发人员可以定义和处理特定于其应用程序的特定错误条件。开发人员可以通过创建自定义异常来改进代码。这允许更具意义的错误消息,并通过指示发生了哪种错误以及错误的来源来促进调试过程。

为了定义一个唯一的异常,我们通常必须创建一个新类,其名称来自 Python 的内置 Exception 类或其子类之一。可以使用相应的 except 代码块来引发此自定义类并捕获它。

开发人员可以在发生特定错误时控制程序的流程并采取适当的操作,例如记录错误、重试操作或优雅地关闭应用程序。自定义异常可以通过覆盖__init__方法并将额外信息存储为实例属性来携带有关错误的额外上下文或数据。

使用自定义异常可以提高复杂程序中错误处理的清晰度。它有助于区分可能需要不同处理策略的不同类型的错误。例如,当文件解析库可能定义诸如 FileFormatError、MissingFieldError 或 InvalidFieldError 等异常来处理文件处理过程中可能出现的各种问题时。这种粒度级别允许客户端代码更有效地捕获和解决特定问题,从而提高软件的健壮性和用户体验。Python 的自定义异常是处理错误和编写更具表现力的代码的绝佳工具。

为什么要使用自定义异常?

Python 中的自定义异常提供了几个优势,这些优势增强了我们代码的功能、可读性和可维护性。以下是使用自定义异常的主要原因:

  • 特异性:自定义异常允许我们表示特定于我们应用程序的特定错误条件。
  • 清晰度:它们使代码更易于理解,因为它们清楚地描述了错误的性质。
  • 粒度:自定义异常允许更精确的错误处理。
  • 一致性:它们有助于在整个代码库中维护一致的错误处理策略。

创建自定义异常

在 Python 中创建自定义异常涉及定义新的异常类,这些类扩展自 Python 的内置 Exception 类或其任何子类。这允许开发人员创建针对其应用程序中特定场景的专门错误类型。以下是如何有效地创建和使用自定义异常:

定义自定义异常类

我们可以通过定义一个继承自Exception或另一个异常类(如RuntimeErrorValueError等)的新类来开始创建自定义异常,具体取决于错误的性质。

以下是定义自定义异常类的示例。在此示例中,CustomError 是一个继承自 Exception 的自定义异常类。__init__ 方法使用可选的错误消息初始化异常 -

class CustomError(Exception):
   def __init__(self, message):
      super().__init__(message)
      self.message = message

引发自定义异常

要引发自定义异常,我们可以使用 raise 语句,后跟自定义异常类的一个实例。可以选择传递一条消息来提供有关错误的上下文。

在此函数process_data()中,当数据参数为空时,会引发 CustomError 异常,以指示特定的错误条件。

def process_data(data):
   if not data:
      raise CustomError("Empty data provided")
   # Processing logic here

处理自定义异常

要处理自定义异常,我们必须使用try-except 块。在 except 块中捕获自定义异常类,并根据需要处理错误。

在下面的代码中,如果process_data([])引发了 CustomError,则 except 块会捕获它,我们可以打印错误消息 (e.message) 或执行其他错误处理任务。

try:
   process_data([])
except CustomError as e:
   print(f"Custom Error occurred: {e.message}")
   # Additional error handling logic

自定义异常示例

以下是 Python 中自定义异常处理的基本示例。在此示例中,我们通过对内置的 Exception 类进行子类化来定义一个自定义异常,并使用 try-except 块来处理自定义异常 -

# Define a custom exception
class CustomError(Exception):
   def __init__(self, message):
      self.message = message
      super().__init__(self.message)

# Function that raises the custom exception
def check_value(value):
   if value < 0:
      raise CustomError("Value cannot be negative!")
   else:
      return f"Value is {value}"

# Using the function with exception handling
try:
   result = check_value(-5)
   print(result)
except CustomError as e:
   print(f"Caught an exception: {e.message}")

输出

执行以上代码后,我们将获得以下输出 -

Caught an exception: Value cannot be negative!
广告