Python - 自定义异常



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

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

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

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

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

为什么要使用自定义例外?

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

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

创建自定义例外

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

定义自定义异常类

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

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


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

引发自定义异常

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

在此函数 process_data() 中,当 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!