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

[经验分享] python的异常

[复制链接]

尚未签到

发表于 2017-4-22 10:09:04 | 显示全部楼层 |阅读模式
python的异常
2011年07月04日
  Python内建异常体系结构  BaseException  
  +--SystemExit  
  +--KeyboardInterrupt  
  +--GeneratorExit  
  +--Exception  
  +--StopIteration  
  +--StandardError  
  |    +--BufferError  
  |    +--ArithmeticError  
  |    |    +--FloatingPointError  
  |    |    +--OverflowError  
  |    |    +--ZeroDivisionError  
  |    +--AssertionError  
  |    +--AttributeError  
  |    +--EnvironmentError  
  |    |    +--IOError  
  |    |    +--OSError  
  |    |         +--WindowsError (Windows)  
  |    |         +--VMSError (VMS)  
  |    +--EOFError  
  |    +--ImportError  
  |    +--LookupError  
  |    |    +--IndexError  
  |    |    +--KeyError  
  |    +--MemoryError  
  |    +--NameError  
  |    |    +--UnboundLocalError  
  |    +--ReferenceError  
  |    +--RuntimeError  
  |    |    +--NotImplementedError  
  |    +--SyntaxError  
  |    |    +--IndentationError  
  |    |         +--TabError  
  |    +--SystemError  
  |    +--TypeError  
  |    +--ValueError  
  |         +--UnicodeError  
  |              +--UnicodeDecodeError  
  |              +--UnicodeEncodeError  
  |              +--UnicodeTranslateError  
  +--Warning  
  +--DeprecationWarning  
  +--PendingDeprecationWarning  
  +--RuntimeWarning  
  +--SyntaxWarning  
  +--UserWarning  
  +--FutureWarning  
  +--ImportWarning  
  +--UnicodeWarning  
  +--BytesWarning  
  try 捕获由Python或程序本身引发的异常 raise 手工地引发一个异常  
  为什么要使用异常
  错误处理,当python检查以程序运行时的错误就引发异常,你可以在程序里捕捉和处理这些错误,或者忽略它们。 事件通知,异常也可以作为某种条件的信号,而不需要在程序里传送结果标志或显式地测试它们。 特殊情形处理,有时有些情况是很少发生的,把相应的处理代码改为异常处理会更好一些。 奇特的控制流,异常是一个高层次的"goto",可以把它作为实现奇特的控制流的基础。如反向跟踪等。  
  异常的基础知识
  python的try语句有两种风格---一种是处理异常(try/except/else),一种是无论是否发生异常都将执行最后的代码(try/finally)。  
  try/except/else风格 try:  
          #运行别的代码  
  except:  
          #如果在try部份引发了'name'异常  
  except,:  
          #如果引发了'name'异常,获得附加的数据  
  else:  
          #如果没有异常发生  
  try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。  
  如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。  
  try/finally风格 try:   
  finally:  
      #退出try时总会执行  
  raise  
  python总会执行finally子句,无论try子句执行时是否发一异常。  
  如果没有发生异常,python运行try子句,然后是finally子句,然后继续。 如果在try子句发生了异常,python就会回来执行finally子句,然后把异常递交给上层try,控制流不会通过整个try语句。  
  当你想无论是否发生异常都确保执行某些代码时,try/finally是有用的。  
  raise  
  要引发异常,你需要写raise语句,它的形式很简单,raise后面跟着要引发的异常。 raise    #手工地引发异常  
  raise,    #传递一个附加的数据  
  什么是异常名(name)呢?它也许是内置作用域内的内置异常(如IndexError),或者是你程序中的任意字符串对象。
  缺省行为:显示错误信息。  $ python test.py  
  Traceback (innermost last):  
  File"test.py", line 3, in?  a =1/0  
  ZeroDivisionError: integer division ormodulo  
  当一个未捕获的异常发生时,python将结束程序并打印一个堆栈跟踪信息,以及异常名和附加信息。
  用try捕获内置异常  
  如果你不想在异常发生时结束你的程序,只需在try里捕获它。 #!/usr/bin/python  
  try:  
  a =1/0  
  printa  except:  
  print'i get the error'  
  当程序运行是会捕获一个错误并执行except后面的代码。
  异常的惯用法  
  异常并不总是坏事情,例如,文件对象的read方法在文件尾时返回一个空串,python也提供一个内置函数raw_input,它从标准输入流读入。与read方法不同,当遇到文件尾时,raw_input()引发内置的EOFError错误。所以可以这样用:  while1:  
  try:  
  line =raw_input()      #从stdin读入行  
  exceptEOFError:  
  break                #在文件末尾退出循环  
  esle:  
  # 其它处理代码  
  用异常传递成功的信号 Found ='item found'  
  defsearch():  
  引发或返回Found  
  try:  
  search()  
  exceptFound:  
  successful  
  else:  
  fail  
  可以使用try来调试代码,你可以用自已的异常处理替换python缺省的异常处理。把整个程序封装在一个外部try里面,你可以捕获运行时的任何异常。
  异常捕获模式  try语句子句形式表  
  except:            捕获所有异常  
  exceptname:        只捕获特定的异常  
  exceptname,value:    捕获异常和它的附加数据  
  except(name1,name2):    捕获任何列出的异常  
  else:            如果没有异常  
  finally:        总是执行  
  捕获多个异常中的一个,python从上到下地查看except子句,括号里列出多个异常与列出单独的异常是一样的,只是更简洁一些。
  运行时嵌套的异常,python会匹配最近的except。
  finally子句无论如何都会执行,所以它是做清除动作的好地方,如关闭一个文件的操作。
  捕捉所有异常 try:  
  # 你的代码  
  exceptBaseException, e:  
  print(str(e))

运维网声明 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-367635-1-1.html 上篇帖子: python 实用技巧 下篇帖子: python学习1
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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