内置的异常的基类是什么

在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>)