详解Python 定义自己的异常类

  • Post category:Python

Python中的异常处理机制是通过try和except来实现的,但有时候我们需要自定义一些异常类,以满足特定的异常情况,那么Python就提供了定义自己的异常类的方式。

下面是定义自己的异常类的步骤:

  1. 继承Exception或其派生类。
  2. 定义异常处理器 init() 方法,该方法可以带有参数,用于对异常信息初始化。
  3. 定义查看异常信息的 str() 方法。

下面是一个自定义异常的示例:

class MyException(Exception):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return self.msg

在上面的代码中,我们定义了一个MyException类,继承自Exception类,并重载了该类的__init__()和__str__()方法。这个类可以用于处理我们的自定义异常。

下面是一个使用自定义异常的示例:

def divide(num1, num2):
    if num2 == 0:
        raise MyException("division by zero!")
    else:
        return num1 / num2

try:
    divide(10, 0)
except MyException as e:
    print(e)

在上面的代码中,我们使用自定义的MyException类,在除数为0的情况下,抛出自己定义的异常,然后在上层使用try和except捕获并处理这个异常。

另外,还可以定义多个异常类,用于区分不同的异常情况:

class NegativeNumberException(Exception):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return self.msg

class ZeroException(Exception):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return self.msg

如上代码中,我们定义了两个异常类:NegativeNumberException和ZeroException。分别表示输入为负数和输入为0的异常情况。

下面来看一个使用这两个异常类的示例:

def sqrt(num):
    if num < 0:
        raise NegativeNumberException("Cannot compute square root of negative number.")
    elif num == 0:
        raise ZeroException("Cannot compute square root of zero.")
    else:
        return math.sqrt(num)

try:
    sqrt(-1)
except NegativeNumberException as e:
    print(e)

try:
    sqrt(0)
except ZeroException as e:
    print(e)

在上面的代码中,我们使用了上面定义的两个异常类,分别处理输入为负数和输入为0的情况。这时,当我们尝试对-1和0求平方根时,程序会抛出相应的异常,并被catch到,并输出相应的错误信息。