设为首页 收藏本站
查看: 795|回复: 0

[经验分享] python 错误与异常

[复制链接]

尚未签到

发表于 2017-4-25 12:39:04 | 显示全部楼层 |阅读模式
作者:jofranks 原创作品,转载请标明出处!版权所有,侵权必究!

来源:http://blog.csdn.net/jofranks



异常、错误是在写程序是必不可免的,只要是人就会犯错误。一旦错误出现,我们的程序就会停止执行,你必须将程序修改过才可以正常运行。

异常是因为程序出现错误而在正常控制流以外采取的行为。   采取的这个行为是什么呢?  它分为两方面,分别是:【1】引起异常发生的错误。只要检测到错误并且意识到异常条件,解释器就会引发(触发/抛出/生成)一个异常。当然,我们也可以自己来引发一个异常。      总的来说,异常就是错误发生的信号。

【2】检测。


异常和错误不光是在python中存在,在像C、C++、Objective-c、java等语言中都是存在的。他们都是相似的。

python中采用“尝试(try)”块和“捕获(catching)”块的概念,在异常处理方面更有"纪律性";



OK,下面我们就来看看python中的异常。

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

2:ZeroDivisionError:除数为0

3:SyntaxError:Python解释器语法错误      此异常是唯一一个不是在运行时发生的异常。

4:IndexError:请求的错音超出序列范围

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

6:IOError:输入/输出错误

7:AttributeError:尝试访问未知的对象属性

 

首先先来看一下 try语句:  try-except、try-finally。

这两种语句你只能用其中的一种,一个try只能对应一个或者多个except子句,但只能对应一个finally子句,或是一个                try-except-finally复合语句。

1、try-except

 

[python] view plaincopy


  • try:  
  •      监控这里的异常  
  • except Exception[, reason]:  
  •      异常处理代码  


我们也可以来看一个例子:
 

[plain] view plaincopy


  • try:  
  •       a = 1 / 0  
  • except ZeroDivisionError, e:  
  •       print 'error:', e  


它在执行的时候,如果try块中的代码没有任何错误,那么他就会忽略except中的部分。而发生异常就会执行except中的部分。
在try块中,如果发现异常,从异常点开始往后的代码将不会执行。此后解释器将开始寻找处理器,找到了就执行,没有找到就会将异常移交给上一层去处理,如果上一层也没找到那么就会继续上交,知道找到合适的处理器。如果最终没有找到,那么异常就是未处理!



OK,下面我们来看一下一个try块跟随多个except的形式。

 

[python] view plaincopy


  • try:  
  •       监控这里的异常  
  • except Exception1[, reason]:  
  •       异常处理代码  
  • except Exception2[, reason]:  
  •       异常处理代码  
  • ......  


  其执行也是相同的,发生异常,解释器将在这一串处理器中寻找匹配异常!
  我们也可以这样来写:
[python] view plaincopy


  • try:  
  •     。。。。  
  • except (Exception1, Exception2)[, reason]:  
  •     ....  


其实except可以处理任意过个异常,但是这有个条件就是:他们要被放在一个元组里:  except (E1[, E2[, E3]])[, reason]
值得说的是,在python中不提倡空except子句,如果你想捕获所有的异常,那么我们就要使用python中异常的一个类,就是BaseException。

                                             except   BaseException, e:



好了,找到异常好说,如果我们在try范围内没有异常被检测到呢?  大家都知道if--else  语句, 在这里也是,他找不到我们也给他一个else子句,让他去执行。

在这里,我们的else子句中的代码执行之前,我们的try范围内的代码必须完全成功。





  2、try-finally语句
  finally子句是无论异常发生还是不发生,捕获还是不捕获都会执行的代码段。
[python] view plaincopy


  • try:  
  •     A  
  • except e:  
  •     B  
  • else:  
  •     C  
  • finally:  
  •     D  

先来看看try-finally 和 try-except 的区别,他们的区别就是用来捕获异常的。  无论try中是否有异常触发,finally代码段都会被执行。  我们来看看他的执行:  当try范围中的代码产生一个异常的时候会立即跳到finally子句中,当finally子句中的代码执行完毕后又会继续try中的代码执行。
  最后要注意的是: finally中的代码引发了另一个异常或由于return、break、continue语法而终止,原来的异常将丢失而且无法重新引发。
  

  我们现在学到的异常是由解释器引发的,但是我们还可以自己触发异常,这就是raise语句了:
[python] view plaincopy


  • raise [someException [, args [ , traceback]]]  


someException 是触发异常的名字,他须是一个字符串,类或实例。  args是可选的,他可以使一个单独的对象,也可以是一个对象的元组。
  traceback他也是可选的,当异常触发时新生成的一个用于异常-正常化的跟踪记录对象。  如果你想要重新引发一个异常,这个参数是很有用的。
  

断言:
  他是一句必须等价于布尔真的判定。
  当异常发生的时候,意味着表达式为假。
  断言是通过assert语句实现的,你可以简简单单的想像为 raise-if语句。
[python] view plaincopy


  • assert expression[ , arguments]  


如果断言成功了,那好说啥都不干。如果失败那么就要出发AssertionError异常了。  如:

[python] view plaincopy


  • assert 1 == 1  
  • assert 2 + 2 == 2 * 2  
  • assert range(3) == [0, 1, 2]  

  我们可以用try-except来捕获异常,也可以提供一个异常参数给assert
[python] view plaincopy


  • try:  
  •     assert q == 0, 'one does not equal zero silly!'  
  • except AssertionError, args:  
  •     print '%s: %s' % (args.__class__.__name__, args)  


输出是: AssertionError:one does not equal zero silly!  

最后来讨论一下我们为什么要用异常:

现 今,随着科技和社会的发展,互联网的发展,软件也不止是针对GUI的用户了,web服务器也将成为应用软件的主要客户了,对于服务器来说,应用程序不能只 是直接的失败或崩溃,如果是这样,那么将导致用户浏览网页返回错误,我相信这是每一个互联网公司或是个人站长不愿意见到的,也是用户不愿意见到的。

还有就是就程序员来说,当创建一个应用程序的时候,你用了很多的资源,但是用户敲击键盘中断,应用程序不会去执行清理的工作,可能导致数据的丢失等一些列的问题。  还有就是当写代码的时候,函数必须去重写来为错误的庆幸返回一个“特殊”的值。

异常可以简化我们的代码,也可以检错整个错误管理的体系。


 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-369144-1-1.html 上篇帖子: Python,how do you work 下篇帖子: python 变量命名规范
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表