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()