零基础学Python:异常检测及处理

前言python

本文的文字及图片来源于网络,仅供学习、交流使用,不具备任何商业用途,若有问题请及时联系咱们以做处理。网络

PS:若有须要Python学习资料的小伙伴能够点击下方连接自行获取框架

Python免费学习资料、代码以及交流解答点击便可加入函数


 

1.异常

在运行或编写一个程序时常会遇到错误异常,这时 python 会给你一个错误提示类名,告诉出现了什么样的问题(Python是面向对象语言,因此程序抛出的异常也是类)。能很好的理解这些错误提示类名所表明的意思,能够帮助你在最快的时间内找到问题所在,从而解决程序上的问题是很是有帮助的。学习

Python中的异常

在先前的一些章节里你已经执行了一些代码,你必定遇到了程序“崩溃”或因未解决的错误而终止的状况。你会看到“跟踪记录(traceback)”消息以及随后解释器向你提供的信息,包括错误的名称、缘由和发生错误的行号。无论你是经过 Python 解释器执行仍是标准的脚本执行,全部的错误都符合类似的格式,这提供了一个一致的错误接口。全部错误,不管是语意上的仍是逻辑上的,都是因为和 Python 解释器不相容致使的,其后果就是引起异常。ui

咱们来看几个异常的例子。操作系统

NameError

尝试访问一个未申明的变量3d


NameError 表示咱们访问了一个没有初始化的变量。对象

 

在 Python 解释器的符号表没有找到那个那个被调用的变量。任何可访问的变量必须先定义才能使用,访问变量须要由解释器进行搜索,若是请求的名字没有在任何名称空间里找到,那么将会生成一个NameError 异常。blog

ZeroDivisionError

除数为零


任何数值被零除都会致使一个 ZeroDivisionError 异常。

 

SyntaxError

Python解释器语法错误


SyntaxError 表明Python代码中有一个不正确的结构,在它改正以前程序没法执行。

 

IndexError

请求的索引超出序列范围


IndexError 在你尝试使用一个超出范围的值索引序列时引起。

 

KeyError

请求一个不存在的字典关键字


映射对象,例如字典,是依靠关键字(key)访问数据值的。若是使用错误的或是不存在的键请求字典就会引起一个KeyError异常。

 

IOError

操做的文件不存在


相似尝试打开一个不存在的磁盘文件一类的操做会引起一个操做系统输入/输出(I/O)错误。任何类型的I/O错误都会引起IOError异常。

 

AttributeError

尝试访问未知的对象属性


在咱们的例子中,咱们在 myInst.bar 储存了一个值,也就是实例 mylnst 的 bar 属性。属性被定义后,咱们可使用熟悉的点/属性操做符访问它,但若是是没有定义属性,例如咱们访问 foo 属性,将致使一个 AttributeError 异常。

 

检测和处理异常

异常能够经过try语句来检测。任何在try语句块里的代码都会被监测,检查有无异常发生。

try语句有两种主要形式:try-except和try-finally。这两个语句是互斥的,也就是说你只能使用其中的一种。一个try语句能够对应一个或多个except子句,但只能对应一个finally子句,或是一个try-except-finally复合语句。

可使用try-except语句检测和处理异常。也能够添加一个可选的else子句处理没有探测到异常的执行的代码。而try-finally只容许检测异常并作一些必要的清除工做(不管发生错误与否),没有任何异常处理设施。正如你想像的,复合语句二者均可以作到。

try-except语句

try-except语句(以及其更复杂的形式)定义了进行异常监控的一段代码,而且提供了处理异常的机制。

最多见的try-except语句语法以下所示。它由try块和except块(try_suite和except_suite)组成,也能够有一个可选的错误缘由。

 

 

用一个例子说明这一切是如何工做的。将使用上边的IOError例子,把代码封装在try-except里,让代码更健壮:

 


若是输入的是一个数字字符串,代码运行时彷佛没有遇到任何错误。当尝试转化一个非数字字符时仍然发生了错误。为了防止错误发生而致使的程序中止,可使用 try...except 语句捕捉错误。

在程序运行时,解释器尝试执行try块里的全部代码,若是代码块完成后没有异常发生,执行流就会忽略except语句继续执行。而当except语句所指定的异常发生后,咱们获取了错误的缘由,控制流当即跳转到对应的处理器(try子句的剩余语句将被忽略)。

 

 

能够只捕获 ValueError 异常。任何其余异常不会被咱们指定的处理器捕获。举例说,若是你要捕获一个特定的异常,你必须加入一个特定的异常处理器。

try语句块中异常发生点后的剩余语句永远不会到达(因此也永远不会执行)。一旦一个异常被引起,就必须决定控制流下一步到达的位置。剩余代码将被忽略,解释器将搜索处理器,一旦找到,就开始执行处理器中的代码。

若是没有找到合适的处理器,那么异常就向上移交给调用者去处理,这意味着堆栈框架当即回到以前的那个。若是在上层调用者也没找到对应处理器,该异常会继续被向上移交,直到找到合适处理器。若是到达最顶层仍然没有找到对应处理器,那么就认为这个异常是未处理的,Python解释器会显示出跟踪记录,而后退出。

带有多个 except 的 try 语句

在本章的前边,咱们已经介绍了except的基本语法:

 

 

这种格式的except语句指定检测名为Exception的异常。你能够把多个except语句链接在一块儿,处理一个try块中可能发生的多种异常,以下所示:

 


一样,首先尝试执行try子句,若是没有错误,忽略全部的except从句继续执行。若是发生异常,解释器将在这一串处理器(except子句)中查找匹配的异常若是找到对应的处理器,执行流将跳转到这里。

咱们的safe_float()函数已经能够检测到指定的异常了。更聪明的代码可以处理好每一种异常。这就须要多个except语句,每一个except语句对应一种异常类型。Python支持把except语句串连使用咱们将分别为每一个异常类型分别建立对应的错误信息,用户能够获得更详细的关于错误的信息:

 

 

使用错误的参数调用这个函数,咱们获得下面的输出结果:

 

finally子句

finally 子句是不管异常是否发生,是否捕捉都会执行的一段代码。你能够将 finally 仅仅配合 try 一块儿使用,也能够和 try-except (else也是可选的)一块儿使用。独立的 try-finally 将会在下一章介绍,咱们稍后再来研究。

从Python 2.5开始,你能够用finally子句(再一次)与try-except或try-except-else—起使用。之因此说是“再一次”是由于不管你相信与否,这并非一个新的特性。回顾Python初期,这个特性早已存在,可是在Python 0.9.6(1992 4月)中被移除。那时,这样能够简化字节码的生成,并方便解析,另外vanRossum认为一个标准化的try-except(-else)-finally不管如何不会太流行。然而,十年时间改变了一切!

下面是try-except-else-finally语法的示例:

 

 

finally都是可选的。A、B、C是程序(代码块)。程序会按预期的顺序执行。(注意:可能的顺序是AD[正常]或AD[异常])。不管异常发生在Α、Β和/或C都将执行finally块。旧式写法依然有效,因此没有向后兼容的问题。

总结

1.只处理你知道的异常,避免捕获全部异常而后吞掉它们。2.抛出的异常应该说明缘由,有时候你知道异常类型也猜不出因此然。3.避免在 except 语句块中干一些没意义的事情,捕获异常也是须要成本的。4.不要使用异常来控制流程,那样你的程序会无比难懂和难维护。5.若是有须要,切记使用 finally 来释放资源。6.若是有须要,请不要忘记在处理异常后作清理工做或者回滚操做。

相关文章
相关标签/搜索