python的异常处理机制设计的比较传统,在日常的开发中,基本满足我的需要
下面就python的异常,几点小小的讨论
1. try...except
- tommy@lab3:~$ python
- Python 2.5 . 2 (r252: 60911 , Jan 4 2009 , 17 : 40 : 26 )
- [GCC 4.3 . 2 ] on linux2
- Type "help" , "copyright" , "credits" or "license" for more information.
- >>> 1 / 0
- Traceback (most recent call last):
- File "<stdin>" , line 1 , in <module>
- ZeroDivisionError: integer division or modulo by zero
- >>>
- >>> try :
- ... 1 / 0
- ... except :
- ... print "do something..."
- ...
- do something...
- >>>
2. try...finally
finally 里面只是执行完成try中的代码后,必须执行的代码,
即使是 try中有异常抛出,也是会去执行finally
- >>> try :
- ... 1 / 0
- ... finally :
- ... print "I just finally do something ,eg: clear!"
- ...
- I just finally do something ,eg: clear!
- Traceback (most recent call last):
- File "<stdin>" , line 2 , in <module>
- ZeroDivisionError: integer division or modulo by zero
- >>>
所以,一般情况下,finally里面执行的都是一些清理工作,比如:关闭文件描述符,释放锁等
- >>> try :
- ... fd=open("have-exists-file" , "r" )
- ... print "do some thing ,read file ,write file..."
- ... finally :
- ... fd.close()
- ...
- do some thing ,read file ,write file...
- >>>
多线程中,对锁的使用
- tommy@lab3:~$ python
- Python 2.5 . 2 (r252: 60911 , Jan 4 2009 , 17 : 40 : 26 )
- [GCC 4.3 . 2 ] on linux2
- Type "help" , "copyright" , "credits" or "license" for more information.
- >>> import threading
- >>> l_lock=threading.RLock()
- >>> try :
- ... l_lock.acquire()
- ... print "do some thing."
- ... finally :
- ... l_lock.release()
- ...
- True
- do some thing.
- >>>
注意,finally中,如果出现异常,外部如果没有相应的捕获机制,该异常会层层抛出,直到最顶端,然后解释器停止
一般我们会这样做
- >>> try :
- ... try :
- ... fd=open("no-exists-file" , "r" )
- ... print "do some thing ,read file ,write file..."
- ... finally :
- ... fd.close()
- ...except :
- ... print "catch finally exception."
- do some thing ,read file ,write file...
- >>>
3. 封装了一个全局的捕获异常的函数(偶比较懒,就用了全部的捕获异常方法)
- import traceback
- import sys
- def trace_back():
- try :
- return traceback.print_exc()
- except :
- return ''
具体使用
- try :
- do_something()
- except :
- print trace_back()
写的比较散,主要是想说说,python异常的简单使用,已经封装的一个简单的获得异常发生时,全局保持的异常信息(可能不准确,但基本够用)