内置的异常的基类是什么 ------------------------------------ 在Python中所有的异常都是从BaseException派生出来的,即BaseException是所有 异常的基类。 Python的异常继承关系如下:: BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StopAsyncIteration +-- ArithmeticError | +-- FloatingPointError | +-- OverflowError | +-- ZeroDivisionError ...... 用户定义的异常从哪里继承? '''''''''''''''''''''''''' 通常应当从Exception或其子类来继承,Exception是所有非退出异常的基类。 SystemExit是 sys.exit() 函数引发,通常就需要程序退出,因此不需要捕获。 KeyboardInterrupt是当用户点击中断键时(通常是Control-C)引发。这种情况下 通常是需要程序退出的, 因此也不需要程序捕获。 事实上,Python内置的异常继承体系就是为了防止用户误处理要求系统的异常,因此将 系统异常和普通的程序异常并列,我们只需要从Exception类或其子类来继承即可。 用户如何主动触发异常 ''''''''''''''''''''' 通过调用raise来触发异常。 例如如果遇到一个错误的输入,我们触发一个异常:: def fn(input): if(input>100): raise ValueError("input error") fn(200) 为什么使用异常 ''''''''''''''''''''' 在c语言中,函数调用出现错误经常使用负值(-1)来返回,但真正的错误码可能写 在errno这个全局变量中。例如open()函数就是这样的。 在python如果返回错误,也可以使用负值,但某些情况负值是合理的值,那如何返回 错误呢?这就使用异常来带回函数调用的错误,并且和正确的流程完全区分开来。这就是 异常的优势所在。 如何查看异常的详细信息 '''''''''''''''''''''''''' sys模块的exc_info()函数可以获取当前异常的信息,它包含三部分,异常的类型,异常的值 以及异常发生的堆栈信息。例如发生了除数为0的异常信息:: (, ZeroDivisionError('division by zero',), )