1、什么是异常
错误:是语法或是逻辑上的。
错误发生将导致异常。异常是因为程序出现了错误而在正常控制流以外采取的行为。该行为分为两个阶段:首先是引起异常发生的错误,然后是检测(和采取可能得措施)阶段。
1965年左右,PL/1作为第一个支持异常的主要语言出现。
2、Python中的异常
3、检测和处理异常
异常可以通过try语句来检测。
(1)try-except语句
try:
try_suite
except Exception[,reason]:
except_suite
(2)包装内建函数
drf safe_float(obj):
try:
retval=float(obj)
except ValueError:
retval='could not convert non-number to float'
return retval
(3)带有多个异常的except语句
try:
try_suite
except Exception1[,reason1]:
except_suite1
except Exception2[,reason2]:
except_suite2
:
(4)处理多个异常的except语句
except (Exception1,Exception2) [,reason]:
(5)捕获所有异常(1.5)
try:
try_suite
except Exception,e:
except_suite
或者(不太推荐):
try:
try_suite
except:
except_suite
例如:
try:
try_suite
except (KeyboardInterupt,SystemExit):
raise
except Exception:
except_suite
2.5中,BaseException成为“所有异常之母”。
-| BaseException
-| KeyboardInterupt
-| SystemExit
-| Exception
-| (all other current built-in exception)
(6)异常参数
except Exception [,reason]:
reason为异常参数,包含来自导致异常的代码的诊断信息的类实例。异常参数本身会组成一个元组,并存储为类实例(异常类的实例)的属性。这里的reason将会是一个Exception类的实例。调用str(reason)总会返回一个良好可读的错误原因。
(7)else子句
在try范围没有异常被检测到时,执行else子句。
(8)finally子句
try:
A
except Exception:
B
else:
C
finally:
D
(9)try-finally子句
try-finally常常用来维持一致的行为而无论异常是否发生。
try:
try_suite
finally:
finally_suite
当finally中所有代码执行完毕后,会继续向上一层引发异常。
①
try:
try:
try_suite
except Exception:
...
finally:
finally_suite
②
try:
try:
try_suite
finally:
finally_suite
except Exception:
...
②可以同时处理在原始的try语句块和finally语句块中发生的错误。
唯一的问题是:当finally中的确发生异常时,会丢失原来异常的上下文信息。
(10)try-except-else-finally
4、上下文管理
(1)with语句
2.5 from __future__ import with_statement 可以使用with语句。
2.6 with成为关键字。
try-except和try-finally的一种特定的配合用法是保证共享的资源的唯一分配,并在任务结束的时候释放它。比如文件(数据、日志、数据库等等),线程资源,简单同步,数据库连接等等。with语句的目标就是应用在这种场景。
with context_expr [as var]:
with suite
with仅能工作于支持上下文管理协议(context management protocol)的对象。显然,只有内建了“上下文管理”的对象才可以与with一起使用。
目前已经有一些支持该协议的对象:
例:
with open('/etc/passwd','r') as f:
for eachLine in f:
...
无论在这一段代码的开始,中间,还是结束时发生异常,会执行清理的代码,此外文件仍会被自动的关闭。
(2)上下文管理协议
上下文对象调用它的__enter()__方法完成with语句块执行前的所有准备工作。
上下文对象的__exit()__方法在with语句块执行结束后被调用,在该方法中进行清理工作。
上下文管理的职责是提供一个上下文对象。这是通过调用__context()__方法来实现的。
5、触发异常
(1)raise语句
raise [SomeException [,args [,traceback]]]
(2)raise语句的用法
6、断言
断言语句语法
assert expression [,arguments]
断言语句:如果断言成功不采取任何措施(类似语句),否则触发AssertionError(断言错误)的异常。可以使用try-except语句捕获AssertionError异常。
我们可以提供一个异常参数给我们的assert命令。
assert 1==0,'One does not equal zero silly!'
7、标准异常
8、相关模块
exceptions 内建异常(永远不用导入该模块)
contextlib(2.5) 为使用with语句的上下文对象工具
sys 包含各种异常相关的对象和函数(见sys.ex**)
sys模块中exc_info()函数可以获取异常信息。