您的位置:首页 > 编程语言 > Python开发

Python 异常处理方法try&except

2018-10-26 11:51 471 查看

Python 异常处理
python提供了异常处理工具来处理python程序在运行中出现的异常和错误。也可以使用该功能来调试python程序。

  • 相关概念:
    异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

python标准异常的异常名称 及描述:

异常名称	描述
BaseException	所有异常的基类
SystemExit	解释器请求退出
KeyboardInterrupt	用户中断执行(通常是输入^C)
Exception	常规错误的基类
StopIteration	迭代器没有更多的值
GeneratorExit	生成器(generator)发生异常来通知退出
StandardError	所有的内建标准异常的基类
ArithmeticError	所有数值计算错误的基类
FloatingPointError	浮点计算错误
OverflowError	数值运算超出最大限制
ZeroDivisionError	除(或取模)零 (所有数据类型)
AssertionError	断言语句失败
AttributeError	对象没有这个属性
EOFError	没有内建输入,到达EOF 标记
EnvironmentError	操作系统错误的基类
IOError	输入/输出操作失败
OSError	操作系统错误
WindowsError	系统调用失败
ImportError	导入模块/对象失败
LookupError	无效数据查询的基类
IndexError	序列中没有此索引(index)
KeyError	映射中没有这个键
MemoryError	内存溢出错误(对于Python 解释器不是致命的)
NameError	未声明/初始化对象 (没有属性)
UnboundLocalError	访问未初始化的本地变量
ReferenceError	弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError	一般的运行时错误
NotImplementedError	尚未实现的方法
SyntaxError	Python 语法错误
IndentationError	缩进错误
TabError	Tab 和空格混用
SystemError	一般的解释器系统错误
TypeError	对类型无效的操作
ValueError	传入无效的参数
UnicodeError	Unicode 相关的错误
UnicodeDecodeError	Unicode 解码时的错误
UnicodeEncodeError	Unicode 编码时错误
UnicodeTranslateError	Unicode 转换时错误
Warning	警告的基类
DeprecationWarning	关于被弃用的特征的警告
FutureWarning	关于构造将来语义会有改变的警告
OverflowWarning	旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning	关于特性将会被废弃的警告
RuntimeWarning	可疑的运行时行为(runtime behavior)的警告
SyntaxWarning	可疑的语法的警告
UserWarning	用户代码生成的警告

常见异常总结归类:

  • 错误:程序运行之前的语法问题,如:关键字、缩进、括号不成对等

  • 异常:在程序运行过程中出现的问题,如:未定义变量、除数为0、属性不存在等

  • 异常处理

    说明:异常处理可以理解为特殊的流程控制语句,可以提高代码的健壮性。
  • 异常语法:

    try:
    print('正常代码')
    # print(a)
    3/0
    except Exception as e:
    # Exception 是所有异常的基类,此处可以捕获所有的异常
    print('出现异常')
    print(e)
    print('其他内容')
  • 多个异常
    # 分类捕获异常

    try:
    # print(a)
    # 3/0
    d = {}
    print(d['name'])
    except NameError as e:
    print('NameError:', e)
    except ZeroDivisionError as e:
    print('ZeroDivisionError:', e)
    except Exception as e:
    print('OtherError:', e)
    try:
    # print(a)
    # 3/0
    fp = open('123.txt')
    except (NameError, ZeroDivisionError) as e:
    # 将某些异常进行统一处理,写在一个元组中即可
    print(e)
    except:
    print('其他异常')
  • 完整结构(else-finally)

    try:
    print('正常代码')
    print(a)
    except:
    # 出现异常时执行
    print('出现异常')
    else:
    # 正常结束(没有异常)时会执行
    print('正常结束')
    finally:
    # 无论有无异常,都会执行
    print('最后执行')
    else:正常结束时执行else中的代码

    finally:无论有无异常,最后都执行
    try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。

    如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。

    如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。

    如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。

  • 抛出异常:raise

    try:
    print('正常代码')
    # 根据业务逻辑的需要,手动抛出异常
    raise Exception('手动抛出的异常')
    except Exception as e:
    print('异常:', e)
    print('OVER')
  • 异常嵌套(try-except结构中再次使用try-except结构)

  • print('我要去上班,什么事也阻止不了我上班的脚步')
    try:
    print('我准备骑电动车')
    raise Exception('昨天晚上不知道哪个缺德的家伙把我充电器拔了')
    print('骑车提前到达公司')
    except Exception as e:
    print(e)
    try:
    print('我准备做公交车')
    raise Exception('等了20分钟一直没有公交车,果断放弃')
    print('坐公交车准时到达公司')
    except Exception as e:
    print(e)
    print('我准备打车')
    print('打车还是快,一会就到达公司')
    print('热情满满的开始一天的工作')
    • 自定义异常类(需要继承自官方的异常基类Exception)
      # 自定义异常类

      class MyException(Exception):
      def __init__(self, msg):
      self.msg = msg
      def __str__(self):
      return self.msg
      
      # 特定异常标准处理方案
      def deal(self):
      print('处理特定的自定义异常')
      
      try:
      print('正常执行')
      # 手动抛出自定义异常
      raise MyException('出现了自定义异常')
      except MyException as e:
      print(e)
      # 调用方法,处理异常
      e.deal()
    • 特殊场景

      当我们进行文件操作时,无论过程中是否有异常,最终我们一定得进行关闭操作

    • 使用with语句,可以保证文件的关闭,无论中间过程是否出现异常

      # fp = open('test.txt', 'r')
      # 中间无论有无异常,最后一定得关闭文件
      # fp.close()
      
      with open('test.txt', 'r') as fp:
      content = fp.read(5)
      print(content)
      # 此处不要考虑文件的关闭问题,也不用是否有异常

    熟练使用此工具,顺利成为调bug小能手!

    阅读更多
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: