python学习笔记之--异常处理
2022-01-09 本文已影响0人
itsenlin
类似于C++/Java等高级语言,python也有异常的处理机制
异常捕获和处理
在python语言中python的异常捕获处理有以下几种方式
try-except语句
- 单个异常
try: 正常流程代码 except IOError, e: IOError异常出现时执行流程
- 多个异常
- 多个except
try: 正常流程代码 except IOError, e: IOError异常出现时执行流程 except ValueError: ValueError异常出现时执行流程
- 单个except
try: 正常流程代码 except (IOError, ValueError), e: IOError或者ValueError异常出现时执行流程
- 多个except
- 捕获所有异常
有两种方式- except后面跟最顶层的异常类
BaseException
try: 正常流程代码 except BaseException, e: 所有异常出现时都会执行流程
- except后面不跟异常类型
try: 正常流程代码 except: 所有异常出现时都会执行流程,这种情况无法获取错误原因,可以通过sys.exc_info()获取
- except后面跟最顶层的异常类
python中异常关系
image.png
else子句
类似python的while/for循环语句,异常处理机制中也可以包含else
子句,只在不出现异常的时候才会执行
要求,else子句必须在所有的except子句后面
try:
正常流程
except XXX:
异常流程
else:
如果未发生异常,则正常流程之后会走此流程
finally子句
如果使用finally子句,无论是否发生异常,finally子句中的流程都会被执行,有三种用法
- try-finally
- try-except-finally
- try-except-else-finally
try:
正常流程:1
except:
异常流程:2
else:
else子句流程:3
finally:
finally子句流程:4
- 当无异常发生时,执行流程1,3,4
- 当有异常发生时,执行流程1,2,4
触发异常
python语言通过raise
关键字主动触发一个异常,语法如下:
raise [SomeException [, args [, traceback]]]
例如:
>>> x = 10
>>> if x > 5:
... raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
Exception: x 不能大于 5。x 的值为: 10
>>>
断言
断言错误(AssertionError)是从Exception继承的一个子异常类,这里单独列出来,是因为类似其他语言的断言,python中也有一个assert
语句来直接实现并且用法很简单,语法如下
assert expression[, args]
例如:
>>> assert 1 == 1
>>> assert 1 == 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
>>> assert 1 == 2, "1 == 2?"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: 1 == 2?
>>>
说明:assert语句的excepression必须等价于一个布尔表达式,args可以存放自定义错误的原因,如上面的例子
with语句
语法
python2.6版本引入了with
语句,此语句相当于封装了try-except-finally
语句,提高了易用性;
with context_expr [as var]:
with_suit
用法
在处理文件时使用with
语句是一个很好的选择,对比如下
- 不使用异常处理时
file = open(...)
file.write(...)
file.close
很显然这种处理方式很糟糕,当要打开的文件无权访问时,程序会直接崩溃
- try-except-finally语句
file = open(...)
try:
file.write(...)
finally:
file.close()
这种处理比较中规中矩,捕获异常,并在finally里进行清理工作
- with语句
with open(...) as file:
file.write(...)
这种处理要比显示的捕获处理异常来得简单很多,代码也比较清晰
原理
with
语句实现原理建立在上下文管理器之上,
上下文管理器是一个实现 __enter__
和__exit__
方法的类。
使用 with
语句确保在嵌套块的末尾调用__exit__
方法。
自定义异常类
可以通过直接或者间接继承自Exception类,来创建自定义的异常类,类相关学习后续单独总结