python捕获函数异常 python捕获错误( 四 )


...syslog.syslog(syslog.LOG_INFO,"no exception caught\n")
... finally:
f.close()
大家看到了没,我们上面那个例子竟然用到了try,except,else,finally这四个子句!:-),是不是很有趣?到现在,你就基本上已经学会了如何在Python中捕获常规异常并处理之 。
3.两个特殊的处理异常的简便方法
3.1断言(assert)
什么是断言,先看语法:
复制代码 代码如下:
assert expression[,reason]
其中assert是断言的关键字 。执行该语句的时候,先判断表达式expression,如果表达式为真,则什么都不做;如果表达式不为真,则抛出异常 。reason跟我们之前谈到的异常类的实例一样 。不懂?没关系,举例子!最实在!
复制代码 代码如下:
assert len('love') == len('like')
assert 1==1
assert 1==2,"1 is not equal 2!"
Traceback (most recent call last):
File "stdin", line 1, in module
AssertionError: 1 is not equal 2!
我们可以看到,如果assert后面的表达式为真,则什么都不做,如果不为真 , 就会抛出AssertionErro异常,而且我们传进去的字符串会作为异常类的实例的具体信息存在 。其实,assert异常也可以被try块捕获:
复制代码 代码如下:
try:
...assert 1 == 2 , "1 is not equal 2!"
... except AssertionError,reason:
...print "%s:%s"%(reason.__class__.__name__,reason)
...
AssertionError:1 is not equal 2!
type(reason)
type 'exceptions.AssertionError'
3.2.上下文管理(with语句)
如果你使用try,except,finally代码仅仅是为了保证共享资源(如文件 , 数据)的唯一分配,并在任务结束后释放它 , 那么你就有福了!这个with语句可以让你从try,except,finally中解放出来!语法如下:
复制代码 代码如下:
with context_expr [as var]:
with_suite
是不是不明白?很正常 , 举个例子来!
复制代码 代码如下:
with open('/root/test.py') as f:
...for line in f:
...print line
上面这几行代码干了什么?
(1)打开文件/root/test.py
(2)将文件对象赋值给f
(3)将文件所有行输出
(4)无论代码中是否出现异常 , Python都会为我们关闭这个文件,我们不需要关心这些细节 。
这下 , 是不是明白了,使用with语句来使用这些共享资源,我们不用担心会因为某种原因而没有释放他 。但并不是所有的对象都可以使用with语句,只有支持上下文管理协议(context management protocol)的对象才可以,那哪些对象支持该协议呢?如下表:
file
decimal.Context
thread.LockType
threading.Lock
threading.RLock
threading.Condition
threading.Semaphore
threading.BoundedSemaphore
至于什么是上下文管理协议 , 如果你不只关心怎么用with,以及哪些对象可以使用with,那么我们就不比太关心这个问题:)
4.抛出异常(raise)
如果我们想要在自己编写的程序中主动抛出异常 , 该怎么办呢?raise语句可以帮助我们达到目的 。其基本语法如下:
复制代码 代码如下:
raise [SomeException [, args [,traceback]]
第一个参数,SomeException必须是一个异常类,或异常类的实例
第二个参数是传递给SomeException的参数,必须是一个元组 。这个参数用来传递关于这个异常的有用信息 。
第三个参数traceback很少用 , 主要是用来提供一个跟中记录对象(traceback)
下面我们就来举几个例子 。
复制代码 代码如下:
raise NameError
Traceback (most recent call last):
File "stdin", line 1, in module