关于Python中异常(Exception)的汇总

683次阅读  |  发布于5年以前

前言

Exception类是常用的异常类,该类包括StandardError,StopIteration, GeneratorExit, Warning等异常类。python中的异常使用继承结构创建,可以在异常处理程序中捕获基类异常,也可以捕获各种子类异常,python中使用try...except语句捕获异常,异常子句定义在try子句后面。

Python中的异常处理

异常处理的语句结构


    try:
     <statements>  #运行try语句块,并试图捕获异常
    except <name1>:
     <statements>  #如果name1异常发现,那么执行该语句块。
    except (name2, name3):
     <statements>  #如果元组内的任意异常发生,那么捕获它
    except <name4> as <variable>:
     <statements>  #如果name4异常发生,那么进入该语句块,并把异常实例命名为variable
    except:
     <statements>  #发生了以上所有列出的异常之外的异常
    else:
    <statements>   #如果没有异常发生,那么执行该语句块
    finally:
     <statement>   #无论是否有异常发生,均会执行该语句块。

说明

raise语句

raise语句用来手动抛出一个异常,有下面几种调用格式:

例如:

抛出带有额外信息的ValueError: raise ValueError('we can only accept positive values')

当使用from的时候,第二个表达式指定了另一个异常类或实例,它会附加到引发异常的__cause__属性。如果引发的异常没有捕获,Python把异常也作为标准出错消息的一部分打印出来:

比如下面的代码:


    try:
     1/0
    except Exception as E:
     raise TypeError('bad input') from E

执行的结果如下:


    Traceback (most recent call last):
     File "hh.py", line 2, in <module>
     1/0
    ZeroDivisionError: division by zero

    The above exception was the direct cause of the following exception:

    Traceback (most recent call last):
     File "hh.py", line 4, in <module>
     raise TypeError('bad input') from E
    TypeError: bad input

assert语句

assert主要用来做断言,通常用在单元测试中较多,到时候再做介绍。

with...as语句

with语句支持更丰富的基于对象的协议,可以为代码块定义支持进入和离开动作。

with语句对应的环境管理协议要求如下:

下面为一个简单的自定义的上下文管理类。


    class Block:
     def __enter__(self):
      print('entering to the block')
      return self

     def prt(self, args):
      print('this is the block we do %s' % args)

     def __exit__(self,exc_type, exc_value, exc_tb):
      if exc_type is None:
       print('exit normally without exception')
      else:
       print('found exception: %s, and detailed info is %s' % (exc_type, exc_value))
      return False

    with Block() as b:
     b.prt('actual work!')
     raise ValueError('wrong')

如果注销到上面的raise语句,那么会正常退出。

在没有注销掉该raise语句的情况下,运行结果如下:


    entering to the block
    this is the block we do actual work!
    found exception: <class 'ValueError'>, and detailed info is wrong
    Traceback (most recent call last):
     File "hh.py", line 18, in <module>
     raise ValueError('wrong')
    ValueError: wrong

异常处理器

如果发生异常,那么通过调用sys.exc_info()函数,可以返回包含3个元素的元组。 第一个元素就是引发异常类,而第二个是实际引发的实例,第三个元素traceback对象,代表异常最初发生时调用的堆栈。如果一切正常,那么会返回3个None。

Python的Builtins模块中定义的Exception


    |Exception Name|Description|
    |BaseException|Root class for all exceptions|
    | SystemExit|Request termination of Python interpreter|
    |KeyboardInterrupt|User interrupted execution (usually by pressing Ctrl+C)|
    |Exception|Root class for regular exceptions|
    | StopIteration|Iteration has no further values|
    | GeneratorExit|Exception sent to generator to tell it to quit|
    | SystemExit|Request termination of Python interpreter|
    | StandardError|Base class for all standard built-in exceptions|
    |  ArithmeticError|Base class for all numeric calculation errors|
    |   FloatingPointError|Error in floating point calculation|
    |   OverflowError|Calculation exceeded maximum limit for numerical type|
    |   ZeroDivisionError|Division (or modulus) by zero error (all numeric types)|
    |  AssertionError|Failure of assert statement|
    |  AttributeError|No such object attribute|
    |  EOFError|End-of-file marker reached without input from built-in|
    |  EnvironmentError|Base class for operating system environment errors|
    |   IOError|Failure of input/output operation|
    |   OSError|Operating system error|
    |    WindowsError|MS Windows system call failure|
    |    ImportError|Failure to import module or object|
    |    KeyboardInterrupt|User interrupted execution (usually by pressing Ctrl+C)|
    |   LookupError|Base class for invalid data lookup errors|
    |    IndexError|No such index in sequence|
    |    KeyError|No such key in mapping|
    |   MemoryError|Out-of-memory error (non-fatal to Python interpreter)|
    |   NameError|Undeclared/uninitialized object(non-attribute)|
    |    UnboundLocalError|Access of an uninitialized local variable|
    |   ReferenceError|Weak reference tried to access a garbage collected object|
    |   RuntimeError|Generic default error during execution|
    |    NotImplementedError|Unimplemented method|
    |   SyntaxError|Error in Python syntax|
    |    IndentationError|Improper indentation|
    |     TabErrorg|Improper mixture of TABs and spaces|
    |   SystemError|Generic interpreter system error|
    |   TypeError|Invalid operation for type|
    |   ValueError|Invalid argument given|
    |    UnicodeError|Unicode-related error|
    |     UnicodeDecodeError|Unicode error during decoding|
    |     UnicodeEncodeError|Unicode error during encoding|
    |     UnicodeTranslate Error|Unicode error during translation|
    |  Warning|Root class for all warnings|
    |   DeprecationWarning|Warning about deprecated features|
    |   FutureWarning|Warning about constructs that will change semantically in the future|
    |   OverflowWarning|Old warning for auto-long upgrade|
    |   PendingDeprecation Warning|Warning about features that will be deprecated in the future|
    |   RuntimeWarning|Warning about dubious runtime behavior|
    |   SyntaxWarning|Warning about dubious syntax|
    |   UserWarning|Warning generated by user code|

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8