区分Exception和Syntax Error
在写Python程序的时候经常会报错,报错通常有以下两种情况:
- 语法错误(Syntax Error): 部分语法错误属于异常
- 异常(Exception)
语法错误
语法错误也称为解析错误,是最常遇到的一种错误
当代码不符合Python语法的时候就会抛出SyntaxError。
异常
Python用异常对象来表示异常情况。遇到错误后,会引发异常。如果异常没有处理或捕捉,程序就会用traceback终止程序的执行,如果是在多线程程序中,则会终止当前线程的执行。
除以0时,就会抛出ZeroDivisionError异常(ZeroDivisionError类的一个实例)。
异常层次结构
Python 3.5.2中内置异常的类层次结构如下:参考标准库
- 所有异常的基类都是BaseException
- 除SystemExit,KeyboardInterrupt,GeneratorExit三种异常外都继承自Exception
捕获异常
捕获异常可以使用try/except语句。try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
try/except
基础语法
示例
多个except
各个except之间的执行顺序:
- except顺序捕获try中抛出的异常
- 越具体的异常应该越靠前,越一般的异常应该越靠后
可选的else语句
语法
如果try部分没有抛出异常,但是又必须执行的语句,则放在else语句中。
代码
finally语句
finally语句用来定义在任何情况下都必须执行的语句。
带return语句的finally执行顺序
可见,在try块中,只要有finally语句,即使函数提前返回,也会在退出try块之前执行finally语句,因此返回值会被finally中的return语句替代。
综合使用示例
结论:
- 任何情况下finally语句都会执行。
- 即使try部分中有return语句,也会在退出try块之前执行finally语句,并且返回值是finally中的return
- 如果有异常没有被处理,则在执行完成finally语句之后会会抛出没有被处理的异常
- 在实际使用中,finally通常用来释放额外的资源,比如文件或者网络连接
主动抛出异常
raise语句
用户自定义异常
用户自定义异常类时,应该直接或者间接的继承自Exception类。
异常的传递
在函数内引发异常时,如果异常没有被捕获到,那么它就会被传播到函数被调用的地方。