社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

51CTO官微 • 7 年前 • 824 次点击  


来源: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
 
824 次点击