Python 异常的传递性及主动抛出学习
异常传递性
在 Python 中,异常可以在程序的不同层次(函数调用堆栈)上传递,直到被处理或到达程序的顶层(主程序)。
如果在一个函数中引发了异常,而该函数又没有进行处理,则该异常会一直沿着函数调用堆栈向上传递,直到遇到某个处理该异常的函数或到达主程序。
下面是一个示例,演示了异常是如何在堆栈中传递的:
def func_a():
print('Starting func_a')
func_b()
print('Ending func_a')
def func_b():
print('Starting func_b')
func_c()
print('Ending func_b')
def func_c():
print('Starting func_c')
raise ValueError('An error occurred in func_c')
print('Ending func_c')
if __name__ == '__main__':
try:
func_a()
except ValueError as e:
print('Caught an exception:', str(e))
在这个示例中,函数 func_c
引发了一个 ValueError
异常。由于 func_c
没有处理这个异常,因此该异常会沿着调用堆栈,传递到 func_b
中。同样的,func_b
也没有处理这个异常,因此它会继续沿着堆栈向上传递,直到 func_a
中。在 func_a
中,我们使用了 try-except
块来处理异常并输出异常信息。
输出如下:
Starting func_a
Starting func_b
Starting func_c
Caught an exception: An error occurred in func_c
主动抛出异常
在 Python 中,我们也可以手动抛出异常,也就是通过 raise
语句来引发一个异常。当我们遇到某些错误或不符合预期的情况时,可以使用这种方法来中止程序运行并通知调用者或用户异常信息。
下面是一个示例,演示了如何抛出一个自定义异常:
class MyException(Exception):
def __init__(self, message):
self.message = message
def __str__(self):
return self.message
def func(x):
if x < 0:
raise MyException('x should be non-negative.')
return x ** 2
if __name__ == '__main__':
try:
print(func(2))
print(func(-2))
except MyException as e:
print('Caught an exception:', str(e))
在这个示例中,我们定义了一个新的异常类 MyException
,它继承自内置的 Exception
类。当参数 x
为负数时,函数 func
会抛出一个 MyException
异常,并将异常信息作为参数传递给构造函数。在主程序中,我们使用了 try-except
块来捕获并处理这个异常。
输出如下:
4
Caught an exception: x should be non-negative.
以上就是 Python 异常的传递性及主动抛出学习的完整攻略,希望能对你有所帮助。