python 异常的传递性及主动抛出学习

  • Post category:Python

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 异常的传递性及主动抛出学习的完整攻略,希望能对你有所帮助。