前言
- Python的異常處理可以向用戶准確反饋出錯信息,所有異常都是基類Exception的子類。
自定義異常都是從基類Exception中繼承,Python自動將所有內建的異常放到內建命名空間中
所以程序不必導入exceptions模塊即可使用異常。 - 需要查看詳細的錯誤信息需導入
import traceback
模塊
捕獲異常的方式
方法一:捕獲所有的異常
try:
1/0
except Exception:
print (Exception)
"""輸出異常類<class 'Exception'>"""
方法二:采用traceback模塊查看異常,需要導入traceback模塊,這個方法會打印出異常代碼的行號
try:
1/0
except:
traceback.print_exc()
"""輸出:
Traceback (most recent call last):
File "C:/Users/Administrator/Desktop/demo04.py", line 123, in <module>
1/0
ZeroDivisionError: division by zero
"""
方法三:采用sys模塊回溯最后的異常
try:
1/0
except:
info = sys.exc_info()
print(info)
print(info[0])
print(info[1])
"""輸出
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero',), <traceback object at 0x000001D3E9FF62C8>)
<class 'ZeroDivisionError'>
division by zero
"""
獲取函數名和行號
上面介紹的方法二回打印出問題代碼的行號,還有一些方法可以獲取函數名和行號
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()
"""輸出:
('callfunc', 131)
"""
import sys
def get_cur_info():
# 獲取當前函數名
print(sys._getframe().f_code.co_name)
# 獲取調用函數名(A調用B函數,獲取A的函數名)
print(sys._getframe().f_back.f_code.co_name)
get_cur_info()
"""輸出:
get_cur_info
<module>
"""