Python中的异常处理机制是通过try和except来实现的,但有时候我们需要自定义一些异常类,以满足特定的异常情况,那么Python就提供了定义自己的异常类的方式。
下面是定义自己的异常类的步骤:
- 继承Exception或其派生类。
- 定义异常处理器 init() 方法,该方法可以带有参数,用于对异常信息初始化。
- 定义查看异常信息的 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到,并输出相应的错误信息。