Python   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了零基础学Python:异常检测及处理大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

前言

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

PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取

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


 

1.异常

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

Python中的异常

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

我们来看几个异常的例子。

NameError

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


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

 

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

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.如果有需要,请不要忘记在处理异常后做清理工作或者回滚操作。

大佬总结

以上是大佬教程为你收集整理的零基础学Python:异常检测及处理全部内容,希望文章能够帮你解决零基础学Python:异常检测及处理所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: