Python异常处理的学习

22 sec read

什么是异常?

异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

当一个未捕获的异常发生时,python将结束程序并打印一个堆栈跟踪信息,以及异常名和附加信息。具体如下:

为什么要使用异常?

  • 错误处理,当python检查以程序运行时的错误就引发异常,你可以在程序里捕捉和处理这些错误,或者忽略它们。
  • 事件通知,异常也可以作为某种条件的信号,而不需要在程序里传送结果标志或显式地测试它们。
  • 特殊情形处理,有时有些情况是很少发生的,把相应的处理代码改为异常处理会更好一些。
  • 奇特的控制流,异常是一个高层次的”goto”,可以把它作为实现奇特的控制流的基础。如反向跟踪等。

Try:捕获由Python或程序本身引发的异常

python的try语句有两种风格:一种是处理异常(try/except/else),一种是无论是否发生异常都将执行最后的代码(try/finally)。

try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。

如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。

python总会执行finally子句,无论try子句执行时是否发一异常。

如果没有发生异常,python运行try子句,然后是finally子句,然后继续。如果在try子句发生了异常,python就会回来执行finally子句,然后把异常递交给上层try,控制流不会通过整个try语句。当你想无论是否发生异常都确保执行某些代码时,try/finally是有用的。

Raise:手工地引发一个异常

要引发异常,你需要写raise语句,它的形式很简单,raise后面跟着要引发的异常。

什么是异常名(name)呢?它也许是内置作用域内的内置异常(如IndexError),或者是你程序中的任意字符串对象。

通过异常名捕获异常

  • 只捕捉一类异常:except ZeroDivisionError:
  • 捕捉部分异常:except (TypeError,NameError):
  • 捕捉全部异常:except:或except BaseException:
  • 捕捉异常后记录下来except Exception,e:

Python内建异常体系结构

其他异常相关内容

assert

这个语句,先判断assert后面紧跟的语句是True还是False,如果是True则继续执行print,如果是False则中断程序,调用默认的异常处理器,同时输出assert语句逗号后面的提示信息。本例情况下,程序中断,提示error,后面的print不执行。

with…as

我们平时在使用类似文件的流对象时,使用完毕后要调用close方法关闭,很麻烦。这里with…as语句提供了一个非常方便的替代方法:open打开文件后将返回的文件流对象赋值给f,然后在with语句块中使用。with语句块完毕之后,会隐藏地自动关闭文件。如果with语句或语句块中发生异常,会调用默认的异常处理器处理,但文件还是会正常关闭。这种情况下,会抛出异常,最后的print不执行。

打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

C语言学习:size_t

在学习C语言的时候,遇到了一个新的数据类型size_t,截止目前也没有完全理清这个类似的具体场景及出现的原因。
44 sec read

C语言学习:main()函数的正确写法

C语言虽然是一门古老的语言,但是其标准一直在完善,所以很多以前支持的语法在到当前已经不能在使用了。 C语言的版
41 sec read

Scipy数学函数的Scala实现

最近在推进项目的时候,遇到需要将线下的Python代码转化成线上的集群代码,由于机器代码环境是Scala,所以
4 min read

发表评论

电子邮件地址不会被公开。 必填项已用*标注