Python - 引发异常



在 Python 中引发异常

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

引发异常是指在程序中显式触发错误条件。这对于处理由于错误或意外情况而无法继续程序的正常流程的情况非常有用。

在 Python 中,您可以引发 ValueError TypeError 等内置异常来指示常见的错误情况。此外,还可以创建和引发自定义异常。

引发内置异常

您可以通过创建 exception 类的实例并使用 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 类或任何其他适当的内置异常类的新类。此自定义异常类可以具有其他属性和方法,以提供有关错误条件的更详细上下文。

在此示例中 -

  • 我们定义了一个继承自 “Exception” 的自定义异常类 “InvalidAgeError”。
  • __init__() 方法使用无效的 age 和默认错误消息初始化异常。
  • 如果提供的年龄超出有效范围,则 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