异常处理及分类总结


导论

世界之大,分类为之,异常那些类,请看如下计算

print(BaseException.__subclasses__())
执行结果:
[<class 'Exception'>, <class 'GeneratorExit'>, <class 'KeyboardInterrupt'>, <class 'SystemExit'>]

由上可知,异常分类

异常分类

BaseException

所有的异常类的鼻祖,具体的异常类都是继承与鼻祖BaseExecption

GeneratorExit

迭代器退出类,注意是Exit不是StopIteration,当调用g.close()时才会触发GeneratiorExit的退出

SystemExit

是系统异常退出的类,要注意sys.exit()函数引发的异常,异常不捕获处理,就直接交给Python解释器,解释器退出。

KeyboardInterrupt

是捕获用户中断行为Ctrl+C的退出
centos 7.4默认安装python 2.7, python2.7写的脚本如下

#!/usr/bin/python
#!conding=utf-8
while True:
    try:
        print 'running'
    except KeyboardInterrupt:
        print 'exit running'
        break
运行结果:
running
running^C
running
exit running

Execption

Execption是所有内建的,非系统退出的异常的基类,自定义异常应该继承自它

重点异常类Execption

Execption是所有内建的,非系统退出的异常的基类,自定义异常应该继承自它。
- SyntaxError语法错误
Python将这种错误也归到异常类下面的Execption下的子类,但是这种错误是不可捕获的

def a():
    try:
        0a = 5
    except:
        pass
运行结果:
File "D:/PycharmProjects/untitled1/5moth/512/exec.py", line 3
    0a = 5
     ^
SyntaxError: invalid syntax
  • ArithmeticError所有算术计算引发的异常,其子类有除零异常等
  • LookupError 使用映射的键或序列的索引无效时引发的异常的基类:IndexError,KeyError

  • 自定义异常
    从Execption继承的类

class MyException(Exception):
    pass
try:
    raise MyException()
except MyException:
    print('catch the excepion')
运行结果:
catch the excepion

异常的捕获

execpt可以捕获多个异常

class MyException(Exception):
    pass
try:
    a = 1/0
    raise MyException()
except MyException:
    print('catch the excepion')
except ZeroDivisionError:
    print('1/0')
except Exception:
    print('Exception')

捕获规则

  • 捕获是从上到下依次比较,如果匹配,则执行匹配的except语句块
  • 如果被一个except语句捕获,其他except语句就不会再次捕获了
  • 如果没有任何一个except语句捕获,则该异常向外抛出

as子句

被抛出的异常,应该是异常的实例,如何获得这个对象呢?使用as子句

class MyException(Exception):
    def __init__(self,code,message):
        self.code = code
        self.message = message

try:
    raise MyException(404,'not found')
except MyException as e:
    print('catch the excepion','+++',e.code,'+++',e.message)
except ZeroDivisionError:
    print('1/0')
except Exception:
    print('Exception')
运行结果:
catch the excepion +++ 404 +++ not found

finally子句

finally功能

f = None
try:
    f = open('test')
except FileNotFoundError as e:
    print(e.__class__,e.errno,e.strerror)
finally:
    print('清理工作')
    if f:
        f.close()

finally执行时机

猜你喜欢

转载自blog.csdn.net/xuexiaoyaani/article/details/80339341
今日推荐