python五大异常处理机制

发布时间:2021-12-08 10:01:32 人气:89 作者:多测师

python五大异常处理机制

    我们明白了什么是异常后,那么发现异常后怎么处理,便是我们接下来要解决的问题。这里将处理异常的方式总结为五种。

  1、默认异常处理机制

  “默认”则说明是解释器默认做出的行为,如果解释器发现异常,并且我们没有对异常进行任何预防,那么程序在执行过程中就会中断程序,调用python默认的异常处理器,并在终端输出异常信息。刚才举过的例子:int(“m”),便是解释器因为发现参数传入异常,这种异常解释器“无能为力”,所以它最后中断了程序,并将错误信息打印输出,告诉码农朋友们:你的程序有bug!!!

  2、try…except…处理机制

  我们把可能发生错误的语句放在try语句里,用except来处理异常。每一个try,都必须至少有一个或者多个except。举一个最简单的例子如下,在try访问number的第500个元素,很明显数组越界访问不了,这时候解释器会发出异常信号:IndexError,接着寻找后面是否有对应的异常捕获语句except ,如果有则执行对应的except语句,待except语句执行完毕后,程序将继续往下执行。如果没有对应的except语句,即用户没有处理对应的异常,这时解释器会直接中断程序并将错误信息打印输出。

  number = 'hello'try: print(number[500]) #数组越界访问except IndexError: print("下标越界啦!")except NameError: print("未声明对象!")print("继续运行...")

  输出结果如下,因为解释器发出异常信号是IndexError,所以执行下标越界语句。

  下标越界啦!

  继续运行...

  为了解锁更多用法,我们再将例子改一下,我们依然在try访问number的第500个元素,造成访问越界错误,这里的except用了as关键字可以获得异常对象,这样子便可获得错误的属性值来输出信息。

  number = 'hello'try: print(number[500]) #数组越界访问except IndexError as e: print(e)except Exception as e: #万能异常

  print(e)except: #默认处理所有异常

  print("所有异常都可处理")print("继续运行...")

  输出结果如下所示,会输出系统自带的提示错误:string index out of range,相对于解释器因为异常自己抛出来的一堆红色刺眼的字体,这种看起来舒服多了(能够“运筹帷幄”的异常才是好异常嘛哈哈哈)。另外这里用到“万能异常”Exception,基本所有没处理的异常都可以在此执行。最后一个except表示,如果没有指定异常,则默认处理所有的异常。

  string index out of range继续运行...

python五大异常处理机制

  3、try…except…finally…处理机制

  finally语句块表示,无论异常发生与否,finally中的语句都要执行完毕。也就是可以很霸气的说,无论产生的异常是被except捕获到处理了,还是没被捕获到解释器将错误输出来了,都统统要执行这个finally。还是原来简单的例子加上finally语句块如下,代码如下:

  number = 'hello'try: print(number[500]) #数组越界访问,抛出IndexError异常except IndexError: print("下标越界啦!")finally: print("finally!")print("继续运行...") #运行

  结果如下,数据越界访问异常被捕获到后,先执行except 语句块,完毕后接着执行了finally语句块。因为异常被执行,所以后面代码继续运行。

  下标越界啦!finally!

  继续运行...

  对try语句块进行修改,打印abc变量值,因为abc变量没定义,所以会出现不会被捕获的NameError异常信号,代码如下所示:

  number = 'hello'try: print(abc) #变量未被定义,抛出NameError异常except IndexError: print("下标越界啦!")finally: print("finally!")print("继续运行...") #不运行

  结果如下,因为NameError异常信号没法被处理,所以解释器将程序中断,并将错误信息输出,但这过程中依然会执行finally语句块的内容。因为程序被迫中断了,所以后面代码不运行。

  finally! #异常没被捕获,也执行了finallyTraceback (most recent call last):

  File "E:/Test_code/test.py",line 3,in

  print("abc")NameError: name 'abc' is not defined

  理解到这里,相信:try…finally…这种机制应该也不难理解了,因为省略了except 捕获异常机制,所以异常不可能被处理,解释器会将程序中断,并将错误信息输出,但finally语句块的内容依然会被执行。例子代码如下:

  number = 'hello'try: print(abc) #变量未被定义,抛出NameError异常finally: print("finally!")print("继续运行...")

  运行结果:

  finally! #异常没被捕获,也执行了finallyTraceback (most recent call last):

  File "E:/Test_code/test.py",line 3,in

  print("abc")NameError: name 'abc' is not defined

  4、assert断言处理机制

  assert语句先判断assert后面紧跟的语句是True还是False,如果是True则继续往下执行语句,如果是False则中断程序,将错误信息输出。

  assert 1 == 1 #为True正常运行assert 1 == 2 #为False,终止程序,错误信息输出

  5、with…as处理机制

  with…as一般常用在文件处理上,我们平时在使用类似文件的流对象时,使用完毕后要调用close方法关闭,很麻烦,这里with…as语句提供了一个非常方便且人性的替代方法,即使突发情况也能正常关闭文件。举个例子代码如下,open打开文件后将返回的文件流对象赋值给fd,然后在with语句块中使用。

  with open('e:/test.txt','r') as fd:

  fd.read()

  print(abc) #变量未被定义,程序终止,错误信息输出print("继续运行...")

  正常情况下,这里的with语句块完毕之后,会自动关闭文件。但如果with语句执行中发生异常,如代码中的变量未定义异常,则会采用默认异常处理机制,程序终止,错误信息输出,后面代码不被运行,文件也会正常关闭。

  以上内容为大家介绍了python五大异常处理机制,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注多测师。https://www.e70w.com/

返回列表
在线客服
联系方式

热线电话

17727591462

上班时间

周一到周五

二维码
线