Python的异常处理可以向用户准确反馈出错信息,所有异常都是基类Exception的子类。自定义异常都是从基类Exception中继承。Python自动将所有内建的异常放到内建命名空间中,所以程序不必导入exceptions模块即可使用异常。
捕获异常的方式
方法一:捕获所有的异常
- try:
- a = b
- b = c
- except Exception,data:
- print Exception,":",data
- '''输出:<type 'exceptions.Exception'> : local variable 'b'
- referenced before assignment '
方法二:采用traceback模块查看异常,需要导入traceback模块,这个方法会打印出异常代码的行号
- try:
- a = b
- b = c
- except:
- print traceback.print_exc()
- '''输出: Traceback (most recent call last):
- File "test.py", line 20, in main
- a = b
- UnboundLocalError: local variable 'b
方法三:采用sys模块回溯最后的异常
- try:
- a = b
- b = c
- except:
- info = sys.exc_info()
- print info
- print info[0]
- print info[1]
- '''输出:
- (<type 'exceptions.UnboundLocalError'>, UnboundLocalError("local
- variable 'b' referenced before assignment",),
- <traceback object at 0x00D243F0>)
- <type 'exceptions.UnboundLocalError'>
- local variable 'b' referenced before assignment
- '''
获取函数名和行号
上面介绍的方法二回打印出问题代码的行号,还有一些方法可以获取函数名和行号
- #!/usr/bin/python
- import sys
- def get_cur_info():
- """Return the frame object for the caller's stack frame."""
- try:
- raise Exception
- except:
- f = sys.exc_info()[2].tb_frame.f_back
- return (f.f_code.co_name, f.f_lineno)
- def callfunc():
- print get_cur_info()
- if __name__ == '__main__':
- callfunc()
- import sys
- def get_cur_info():
- print sys._getframe().f_code.co_name
- print sys._getframe().f_back.f_code.co_name
- get_cur_info()
推荐阅读:
《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码] http://www.linuxidc.com/Linux/2013-11/92693.htm