zoukankan      html  css  js  c++  java
  • [python] 之 异常对象

    一、异常对象

      类异常支持异常的层次结构:超类变成分类名称,而子类变成这个分类中特定种类的异常。except字句列出一个通用的异常超类,就可捕捉整个分类中的各种异常:任何特定的子类都可匹配。

     1 class General(Exception):pass
     2 class Specific1(General):pass
     3 class Specific2(General):pass
     4 
     5 def raise0():
     6     x=General()
     7     raise x
     8 
     9 def raise1():
    10     x=Specific1()
    11     raise x
    12 
    13 def raise2():
    14     x=Specific2
    15     raise x
    16 
    17 for func in (raise0, raise1, raise2):
    18     try:
    19         func()
    20     except General:
    21         import sys
    22         print ("caught:", sys.exc_info()[0])
    23         
    24 for func in (raise0, raise1, raise2):
    25     try:
    26         func()
    27     except General as ins:
    28 #         import sys
    29         print ("caught_as:", ins.__class__)
    30 
    31 # 输出
    32 caught: <class '__main__.General'>
    33 caught: <class '__main__.Specific1'>
    34 caught: <class '__main__.Specific2'>
    35 caught_as: <class '__main__.General'>
    36 caught_as: <class '__main__.Specific1'>
    37 caught_as: <class '__main__.Specific2'>

    注意:

    ①必须继承内置异常超类或内置异常子类,就像object一样:

      内置Exception类:

        BaseException:异常的顶级根类

        Exception:与应用相关的异常顶层根超类

        ArithmeticErrot:所有数值错误的超类

        OverfloeError:识别特定的数值错误的子类

    ②引发实例

      在类异常模式中,我们总是引发和捕获一个类实例对象。异常实例可以在raise之前创建,就像上述列子,也可在raise语句自身中创建。

      可以在except errorname as instance中创建异常实例。

    ③捕获分类

      try语句

    ④异常细节

      主要是通过异常实例进行访问异常细节或异常状态。

    二、异常默认打印和状态

      内置异常都提供了默认打印显示和状态保持,传给这些异常类的任何构造函数参数都会保存在实例的args元组属性中,并且当打印该实例的时候自动显示(如果没有传递构造函数参数,则使用一个空的元组和显示字符串)传递的参数(以字符串的形式显示)。

    1 class E(Exception):pass
    2 
    3 try:
    4     raise E('spam','temp')
    5 except E as x:
    6     print (x)
    7 
    8 #输出
    9 ('spam', 'temp')

    三、异常对象-定制打印显示

      默认情况下,捕获并打印基于类的异常的实例的时候,会显示我们传递给异常类构造函数的任何内容;如果定制显示或打印,则默认显示形式(捕获并打印)的信息为定制__str__中的内容,传递的参数可通过元组属性args访问。

      当没有捕获异常的时候,如果异常类实例作为一条出错信息的一部分显示,这个继承的默认显示模式也会使用;如果没有定制异常类,则显示传递的构造函数参数,如果定制了异常类,则显示为定制的内容。

     1 class Mybad(Exception):pass
     2 
     3 try:
     4     raise Mybad('Sorry! my mistake!')
     5 except Mybad as x:
     6     print (x)
     7     print (x.args)
     8 print ('###'*8)
     9 
    10 class Bad(Exception):
    11     def __str__(self, *args, **kwargs):
    12         return "Always look on the bright side of life ..."
    13 
    14 try:
    15     raise Bad('Bad a bad ')
    16 except Bad as y:
    17     print (y)
    18     print (y.args)
    19 #输出
    20 Sorry! my mistake!
    21 ('Sorry! my mistake!',)
    22 ########################
    23 Always look on the bright side of life ...
    24 ('Bad a bad ',)
    1 class Mybad(Exception):
    2     def __str__(self):
    3         return '没有捕获异常'
    4 
    5 #输出
    6 Traceback (most recent call last):
    7   File "F:python	est.py", line 265, in <module>
    8     raise Mybad('默认')
    9 __main__.Mybad: 没有捕获异常
     1 class Mybad(Exception):pass
     2 
     3 raise Mybad('默认')
     4 
     5 #输出
     6 
     7 Traceback (most recent call last):
     8   File "F:python	est.py", line 265, in <module>
     9     raise Mybad('默认')
    10 __main__.Mybad: 默认

     四、定制数据和行为

      类似与类的继承、定制、扩展;

      使用了异常类实例(如:except Exception as instance)

  • 相关阅读:
    2.7连接数据库中遇见的相应问题1
    linux bash中too many arguments问题的解决方法
    linux系统补丁更新 yum命令
    安装node,linux升级gcc
    python-导出Jenkins任务
    升级openssl和openssh版本
    linux修改文件所属的用户组以及用户
    linux的Umask 为022 和027 都是什么意思?
    keepalived
    自己编写k8s
  • 原文地址:https://www.cnblogs.com/xiaofeiIDO/p/6040888.html
Copyright © 2011-2022 走看看