Py学习  »  Python

干货 | 阿里工程师告诉你Python中异常处理的常用方法总结

51CTO官微 • 6 年前 • 568 次点击  


来源:python语言(今日头条作者)

原文链接:https://www.toutiao.com/i6516671462961578504/

异常处理在任何一门编程语言里都是值得关注的一个话题,良好的异常处理可以让你的程序更加健壮,清晰的错误信息更能帮助你快速修复问题。


如果你想选择一种语言来入门编程,那么Python绝对是首选!


其非常接近自然语言,精简了很多不必要的分号和括号,非常容易阅读理解。编程简单直接,更适合初学编程者,让其专注于编程逻辑,而不是困惑于晦涩的语法细节上,比起JAVA、C#和C/C++这些编程语言相对容易很多。


因此,即使是非计算机专业或者没有基础的小白,也能分分钟入门。Python的排名从去年开始就借助人工智能持续上升,现在它已经成为了第一名。


今天小编和小伙伴们分享一下异常处理的这个常用的解决方法。异常处理在任何一门编程语言里都是值得关注的一个话题,良好的异常处理可以让你的程序更加健壮,清晰的错误信息更能帮助你快速修复问题。在Python中,和不分高级语言一样,使用了try/except/finally语句块来处理异常,如果你有其他编程语言的经验,实践起来并不难。


什么是例外?

01

错误

就软件而言,错误是合乎逻辑的或合乎逻辑的。错误是合乎逻辑的或合乎逻辑的。


语法错误表明,软件的结构中存在错误,无法由解释器解释,也不能编译编译器。这些错误必须在程序执行前更正。


当程序的语法正确时,剩下的就是逻辑错误。逻辑错误可能是由于不完整或非法输入引起的。在其他情况下,可能无法执行逻辑不能生成、计算或输出结果的过程。这些错误通常被称为域错误和范围错误。


当Python检测到错误时,Python解释器指出当前流无法继续。这时有一种反常现象。


02

异常

对异常的最好描述是因为程序错误,在正常控制流之外行为。这种行为分为两个阶段:第一个是导致异常发生的错误,然后是检测(和可能的措施)阶段。


第一阶段发生在异常情况(有时称为异常)之后。只要检测到错误并实现异常条件,解释器中就会出现异常。触发器也可以称为触发器,抛出或生成。解释器通知当前控制流有错误。Python还允许程序员为自己创建异常。无论是Python解释器还是程序员,异常都是错误的信号。


将中断当前流以处理此错误并采取相应操作。这是第二阶段。异常处理发生在第二阶段,在异常发生后,可以调用许多不同的操作。


您可以忽略错误(记录错误,但不采取任何措施,采取补救措施并终止程序),或者试着在减少问题的影响后继续这个过程。


所有这些操作都代表一个延续,或者一个控制分支。关键是程序员可以在错误发生时指示程序是如何执行的。


Python使用异常对象(异常对象)来表示异常,遇到错误时会出现例外情况。


如果异常对象没有被处理或捕获,程序将终止执行,即所谓回溯(回溯)。


异常处理

语句可以用来捕获异常。


试用语句用于检测尝试语句块中的错误,以便除了语句可以捕获异常信息并处理它。


如果您不希望在异常时终止程序,请在尝试中捕获它。


Grammar:

下面是尝试的简单语法……除了…其他的:

尝试的工作原理是:在开始尝试语句时,Python被标记在当前程序的上下文中,这样当出现异常时,它可以返回这里。尝试子句首先执行,接下来会发生什么取决于执行中是否有异常。

  1. 如果在执行语句后执行异常,则Python会跳回去尝试并执行与异常匹配的第一个除外子句。在处理异常之后,控制流将通过整个尝试语句(除非在处理异常时出现新异常)。

  2. 如果在尝试后语句中有一个异常,但是除了子句没有匹配,异常将被发送到上一个尝试或程序的顶部,这将结束程序并打印默认的错误消息。

  3. 如果在尝试子句的执行中没有例外,Python将在其他语句之后执行语句(如果有其他的话),然后通过整个尝试语句控制流。


使用except而不带任何异常类型:

除例外类型外,您可以使用,如下所示:

上面的尝试除了语句捕获所有已经发生的异常。但这不是通过程序识别特定异常信息的好方法。因为它捕获了所有异常。


使用except而带多种异常类型

您还可以使用同一个语句来处理多个异常信息,如下所示:


try-finally 语句

最后一个语句执行最后一个代码,不管是否有异常。

当一个异常被抛出尝试块时,最后块代码立即执行。


在最后一个块中的所有语句执行后,再次触发异常,执行除块代码之外的执行。


参数的内容与异常不同。


下面举个例子:

总结如下:

  1. 除了陈述之外,没有必要,最后的陈述是没有必要的,但两个必须有一个,否则没有尝试的意义。

  2. 除了声明之外,还有不止一种说法。Python将按照除语句外的顺序匹配指定的异常。如果处理异常,则稍后将不进入该例外声明。

  3. 除了语句可以以元组的形式以元组的形式指定多个异常,还可以看到实例代码。

  4. 如果在例外语句之后没有指定异常类型,默认情况下会捕获所有异常,并且可以通过日志记录或sys模块获取当前异常。

  5. 如果你想捕获一个异常来重复它,请使用“上升”,不要带任何参数或信息在它后面。

  6. 不建议捕获和抛出相同的异常。考虑重构代码。

  7. 不建议在逻辑不明确的情况下捕获所有异常,并且可能隐藏了一个非常严重的问题。

  8. 试着更换尝试/除了内置的异常处理语句的语句,如与声明的getattr()方法。


实证案例

传递异常重新引发异常

在python2,为了保持异常的完整信息,你不能在添加例外对象提高当你抓住它了,否则你的跟踪信息将从这里切断。以上是重新抛出异常的最简单方法。


还可以考虑一些其他技术,例如在抛出异常之前更新异常信息。


Python3提高了重复传输的例外,你可以自己试试,但建议同。


Exception 和 BaseException

当我们想要捕捉的一般例外,我们应该使用异常或baseexception?我建议你看看官方文件,这两个例外有什么区别?请看他们之间的继承权。


从异常的层次结构,baseexception是最基本的异常类继承它,和异常。除了所有的例外,baseexception包含三systemexit例外,keyboardinterrupt和generatorexit。


看来,你的程序应该使用异常而不是baseexception当捕获所有异常,因为其他三个例外,属于高层次的例外,和合理的方式应该是Python解释器处理。


except Exception as e和 except Exception, e


代码示例如下所示:

在python2时代,你可以使用任何写作的上述两种风格。在Python3,你只能使用写作第一的风格,和第二形式被遗弃。第一种文字可读性更好,为了程序的兼容性和后期移植的成本,你也留下了第二种写作方式。


raise “Exception string”


将字符串作为异常抛出似乎是非常简单的方法,但这是一个非常坏的习惯。


如果上面的语句被抛出异常,它将是这样的。


这是可接受的在python2.4,但没有指定异常类型,它可能使正确捕获和处理异常的下游,导致你的程序被挂起。总之,这种文体是封建时代的不良习惯,应该扔掉。


使用内置的语法范式代替try/except


Python本身提供了许多语法范式,简化处理异常,如StopIteration异常处理的语句,让你写一个循环顺畅。


在打开文件之后,带语句自动调用关闭的文件操作。当我们编写Python代码时,当遇到这种情况时,我们应该避免尝试/排除/最后考虑。


例如,当我们需要访问一个不确定的属性时,您可能会编写这样的代码:


事实上,你可以使用一个更简单的getattr()来实现你的目标。


最佳实践

最好的做法不限于编程语言,而只限于一些规则,并在填充之后收获。

  1. 例外,您知道,避免捕捉所有异常并吞噬它们。

  2. 抛出的异常应该解释为什么,有时您知道异常类型不能被猜测。

  3. 避免在catch语句块中做一些毫无意义的事情。

  4. 不要使用异常来控制进程,这样您的程序就很难理解和维护。

  5. 如果有需要,记得使用最后释放资源。

  6. 如果您需要它,在处理异常后不要忘记清理或回滚。


异常的查找表






今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/bvDQ4jhKXP
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/6494
 
568 次点击