📜  Python自定义异常(1)

📅  最后修改于: 2023-12-03 15:34:32.305000             🧑  作者: Mango

Python自定义异常

在Python中,我们可以使用内置的异常类来处理程序中出现的错误,比如 IndexError, ValueError, TypeError 等等。但是有时候,我们希望能够自定义一些异常类来更好地处理特定的错误。本文将介绍如何在Python中自定义异常类。

什么是异常类?

在Python中,异常是一种在程序执行过程中出现的错误。当出现错误时,程序会引发一个异常。Python中内置了很多异常类,我们可以使用 try...except 捕获这些异常,进行相应的处理。

例如:

try:
    a = [1, 2, 3]
    print(a[4])
except IndexError:
    print("IndexError: list index out of range")

在这个例子中,我们试图打印一个列表中不存在的元素(下标为4),这会引发一个 IndexError。我们使用 try...except 捕获这个异常,并输出一条自定义的错误信息。

如何自定义异常类?

在Python中,我们可以通过定义一个新的类来自定义异常。我们只需要让这个新类继承自内置的 Exception 类或其子类即可。

例如:

class MyError(Exception):
    pass

这个例子中,我们定义了一个名为 MyError 的异常类,它继承自 Exception 类。现在我们就可以使用 raise 关键字来引发这个异常,并使用 try...except 来捕获它了。

例如:

try:
    raise MyError("Something went wrong")
except MyError as e:
    print(e)

在这个例子中,我们使用 raise 关键字引发了一个 MyError 异常,并传递了一个错误信息 "Something went wrong"。然后我们使用 try...except 来捕获这个异常,并打印出错误信息。

自定义异常类的好处在于,我们可以根据我们的需求自由地定义异常的类型和错误信息,从而更好地处理程序中出现的错误。

自定义异常类的示例

下面是一个更复杂的示例,在这个示例中,我们定义了一个名为 InvalidInputError 的异常类,它继承自内置的 ValueError 类。这个异常类用于处理输入不合法的错误,例如输入的字符串中包含了非数字字符。

class InvalidInputError(ValueError):
    """Raised when the input is not a valid number"""
    
    def __init__(self, message, errors):
        super().__init__(message)
        self.errors = errors

在这个异常类中,我们覆盖了 __init__ 方法,并加入了一个名为 errors 的属性,用于存储错误信息。现在我们可以使用这个异常类来处理输入不合法的情况。

例如:

def calculate_square_root(num):
    if not isinstance(num, (int, float)):
        raise InvalidInputError("Input must be a number", "num")
    if num < 0:
        return None
    return num ** 0.5

在这个例子中,我们定义了一个名为 calculate_square_root 的函数,它用于计算一个数的平方根。我们首先判断输入是否是数字,如果不是就抛出一个 InvalidInputError 异常,并传递错误信息 "Input must be a number" 和错误参数 "num"。然后我们计算该数的平方根,并返回结果。

现在我们可以测试这个函数:

print(calculate_square_root(16))   # 4.0
print(calculate_square_root("hello"))   # 

Traceback (most recent call last):
  File "<ipython-input-29-7adce4ea4cbc>", line 1, in <module>
    print(calculate_square_root("hello"))
  File "<ipython-input-28-ae0e6235c5d9>", line 3, in calculate_square_root
    raise InvalidInputError("Input must be a number", "num")
__main__.InvalidInputError: Input must be a number

在这个例子中,我们先调用了 calculate_square_root(16),这是一个合法的输入,函数返回了正确的结果。然后我们调用了 calculate_square_root("hello"),这是一个非法的输入,函数抛出了一个 InvalidInputError 异常,并打印出了错误信息。

小结

自定义异常类可以帮助我们更好地处理程序中的错误。我们可以根据我们的需求自由地定义异常的类型和错误信息,并使用 raisetry...except 来引发和捕获这些异常。在编写复杂的程序时,自定义异常类可以让我们更清晰地了解程序中的错误类型和出错的位置,从而更容易进行调试和维护。