内置的异常的基类是什么¶
在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的异常信息:
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero',),
<traceback object at 0x05AF2B98>)