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

[经验分享] Python 标准异常总结

[复制链接]

尚未签到

发表于 2018-8-15 07:35:01 | 显示全部楼层 |阅读模式
  在我们编写脚本或者进行软件开发过程中总会遇见很多的异常和错误,而python里面有两个非常重要的功能,能够很好的处理异常和任何意外错误,这两个功能就是异常处理和断言。
  异常处理:主要包含语法错误和其他的标准异常,标准异常介绍如下表。
  断言:断言是一种理智检查,当程序的测试完成,你可以打开或关闭。断言的最简单的方法就是把它比作 raise-if 语句 (或者更准确,加 raise-if-not 声明). 一个表达式进行测试,如果结果出现 false,将引发异常。断言是由 assert 语句,在Python中新的关键字,在Python1.5版本中引入使用的关键字。
  程序员常常放置断言来检查输入的有效,或在一个函数调用后检查有效的输出。
  一、标准异常表
  
  异常名称
描述 Exception  所有异常的基类
StopIteration  当一个迭代器的 next()方法不指向任何对象时引发
SystemExit  由 sys.exit()函数引发
StandardError  除了StopIteration异常和SystemExit,所有内置异常的基类
ArithmeticError  数值计算所发生的所有错误的基类
OverflowError  当数字类型计算超过最高限额引发
FloatingPointError  当一个浮点运算失败时触发
ZeroDivisonError  当除运算或模零在所有数值类型运算时引发
AssertionError  断言语句失败的情况下引发
AttributeError  属性引用或赋值失败的情况下引发
EOFError  当从 input() 函数输入,到达文件末尾时触发
ImportError  当一个 import 语句失败时触发
KeyboardInterrupt  当用户中断程序执行,通常是通过按 Ctrl+c 引发
LookupError  所有查找错误基类
  IndexError
  KeyError
  当在一个序列中没有找到一个索引时引发
  当指定的键没有在字典中找到引发
NameError  当在局部或全局命名空间中找不到的标识引发
  UnboundLocalError
  EnvironmentError
  试图访问在函数或方法的局部变量时引发,但没有值分配给它。
  Python环境之外发生的所有异常的基类。
  IOError
  IOError
  当一个输入/输出操作失败,如打印语句或 open()函数试图打开不存在的文件时引发
  操作系统相关的错误时引发
  SyntaxError
  IndentationError
  当在Python语法错误引发;
  没有正确指定缩进引发。
SystemError  当解释器发现一个内部问题,但遇到此错误时,Python解释器不退出引发
SystemExit当Python解释器不使用sys.exit()函数引发。如果代码没有被处理,解释器会退出。  当操作或函数在指定数据类型无效时引发
ValueError在内置函数对于数据类型,参数的有效类型时引发,但是参数指定了无效值 RuntimeError  当生成的错误不属于任何类别时引发
NotImplementedError  当要在继承的类来实现,抽象方法实际上没有实现时引发此异常
  异常示例:
1、FileNotFoundError  
尝试打开文d:\\openstack.txt文件由于文件不存在就会报出FIleNotFoundError:
  
f=open("d:\\openstack.txt")
  
Traceback (most recent call last):
  
  File "<pyshell#0>", line 1, in <module>
  
    f=open("d:\\openstack.txt")
  
FileNotFoundError: [Errno 2] No such file or directory: 'd:\\openstack.txt'
  

  
2、ZeroDivisionError
  
除法运算或取模运算中,除数为零的情况
  
>>> 5/0
  
Traceback (most recent call last):
  
  File "<pyshell#1>", line 1, in <module>
  
    5/0
  
ZeroDivisionError: division by zero
  
3、ImportError
  
一般是在导入模块时,由于模块不存在等原因导致报错
  
>>> import  wwww
  
Traceback (most recent call last):
  
  File "<pyshell#2>", line 1, in <module>
  
    import  wwww
  
ImportError: No module named 'wwww'
  
4、ValueError
  
一般是由于传入参数的数据类型错误引起报错。
  
>>> a="sterc"
  
>>> int(a)
  
Traceback (most recent call last):
  
  File "<pyshell#4>", line 1, in <module>
  
    int(a)
  
ValueError: invalid literal for int() with base 10: 'sterc'
  
>>>
  
  二、异常处理
    python中包含两种异常处理语句,可以使用try...except...finally或者try...except..else语句来处理异常,接下来简单的介绍两种语句的语法以及两者的区别:
  
  try语句原理:
  首先,执行try子句(在关键字try和关键字except之间的语句)
  如果没有异常发生,忽略except子句,try子句执行后结束。
  如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。最后执行 try 语句之后的代码。
  如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。
  一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
  处理程序将只针对对应的try子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。
  一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。
  try...except..else语法
try:  
   You do your operations here
  
   ......................
  
except ExceptionI:
  
   If there is ExceptionI, then execute this block.
  
except ExceptionII:
  
   If there is ExceptionII, then execute this block.
  
   ......................
  
else:
  
   If there is no exception then execute this block.
  

  
单个 try 语句可以有多个except语句。 当 try 块包含可能抛出不同类型的异常声明这是有用的
  
也可以提供一个通用的 except 子句来处理异常(不提倡)
  
except子句后,可以包括 else 子句。 如果代码在try:块不引发异常则代码在 else 块执行
  
else是可以正常运行部存在异常的代码,这不需要 try: 块的保护
  
  try:
  
   fh = open("testfile", "w+")
  
   fh.write("This is my test file for exception handling!!")
  
except IOError:
  
   print ("Error: can\'t find file or read data")
  
else:
  
   print ("Written content in the file successfully")
  
   fh.close()
  

  
  正常执行后就会生成testfile文件里面的内容为:This is my test file for exception handling!
  
  而控制台输出结果如下:
  
  Written content in the file successfully
  用except子句处理多个异常
  刚才我们的示例是处理了一个类型的异常,而except可以处理多个类型的异常例如
  except(ValueError,ImportError,RuntimeError)这是可以将多个类型的标准错误写成一个元组,但是做个类型容易造成我们队类型的报错分析难度大。
try:  
   fh = open("testfile", "r")
  
   fh.write("This is my test file for exception handling!!")
  
except (ValueError,ImportError,RuntimeError):
  
   print ("Error: can\'t find file or read data")
  
else:
  
   print ("Written content in the file successfully")
  
   fh.close()
  
  结果:
  
  Error: can't find file or read data  #这里没有报出是那个类型的标准错误。
try-finally子句:
  使用 try: 块. finally 块是必须执行,而不管 try 块是否引发异常或没有。try-finally 语句的语法是这样的。
try:  
   You do your operations here;
  
   ......................
  
   Due to any exception, this may be skipped.
except ExceptionI:  
   If there is ExceptionI, then execute this block.
  
except ExceptionII:
  
   If there is ExceptionII, then execute this block.
  finally:
   This would always be executed.  try...except...finally无论try块能否正常的执行,finally是一定会执行的模块。
try:  
   fh = open("testfile", "r")
  
   fh.write("This is my test file for exception handling!!")
  
except (ValueError,ImportError,RuntimeError):
  
   print ("Error: can\'t find file or read data")
  
finally:
  
   print ("Written content in the file successfully")
  
   fh.close() #关闭文件
  
  结果:文件中没有写入内容,
  
  控制台输出以下内容:
  
Error: can't find file or read data
  
Written content in the file successfully
  引发异常
  可以通过使用 raise 语句触发几个方面的异常。对于 raise 语句的一般语法如下。
语法
raise [Exception [, args [, traceback]]]  这里,Exception 是异常的类型(例如,NameError)argument 为异常的参数值。该参数是可选的;如果没有提供,异常的参数是None。
  最后一个参数 traceback,也可选的(实践中很少使用),并且如果存在的话,是用于异常的回溯对象。
示例
  异常可以是一个字符串,一个类或一个对象。大多数Python的异常核心是触发类异常,使用类的一个实例参数的异常。定义新的异常是很容易的,可以按如下做法  -
def functionName( level ):  
    if level <1:
  
        raise Exception(level)
  
        # The code below to this would not be executed
  
        # if we raise the exception
  
    return level
  注意:为了捕捉异常,一个“except”语句必须是指出抛出类对象异常或简单的字符串异常。例如,捕获异常上面,我们必须编写 except 子句如下 -
try:  
   Business Logic here...
  
except Exception as e:
  
   Exception handling here using e.args...
  
else:
  
   Rest of the code here...
  下面的例子说明如何使用触发异常:
#!/usr/bin/python3  
def functionName( level ):
  
    if level <1:
  
        raise Exception(level)
  
        # The code below to this would not be executed
  
        # if we raise the exception
  
    return level
  

  
try:
  
    l=functionName(-10)
  
    print ("level=",l)
  
except Exception as e:
  
    print ("error in level argument",e.args[0])
  这将产生以下结果
error in level argument -10
  用户定义的异常
  Python中,还可以通过内置的异常标准的派生类来创建自己的异常。
  这里是关于 RuntimeError 的一个例子。这里一个类被创建,它是 RuntimeError 的子类。当需要时,一个异常可以捕获用来显示更具体的信息,这非常有用。
  在try块,用户定义的异常将引发,并夹在 except 块中。 变量e是用来创建网络错误 Networkerror 类的实例。
class Networkerror(RuntimeError):  
   def __init__(self, arg):
  
      self.args = arg
  所以上面的类定义后,可以引发异常如下 -
try:  
   raise Networkerror("Bad hostname")
  
except Networkerror,e:
  
   print e.args

运维网声明 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-551900-1-1.html 上篇帖子: Python操作mysql之插入数据 下篇帖子: 云计算与数据科学:Microsoft Azure 机器学习与Python 简介
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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