[英]How to print line number of error that is inside a function using except in Python?
我想以一種很好的顯示方式打印錯誤的行號和錯誤消息。 以下是我的代碼,它使用linecache :
import linecache
def func():
if xx == 1:
print('ok')
try:
func()
except:
exc_type, exc_obj, tb = sys.exc_info()
f = tb.tb_frame
lineno = tb.tb_lineno
filename = f.f_code.co_filename
linecache.checkcache(filename)
line = linecache.getline(filename, lineno, f.f_globals)
print_('ERROR - (LINE {} "{}"): {}'.format(lineno, line.strip(), exc_obj))
但是,這僅給出了func()
的位置:
ERROR - (LINE 8 ""): name 'xx' is not defined
有沒有辦法打印實際發生錯誤的行號,應該是第4行? 或者更好的是,我可以打印第 8 行然后追溯到第 4 行嗎? 例如,如果我不使用try - except
,代碼:
def func():
if xx == 1:
print('ok')
func()
會給我如下錯誤信息,這樣定位錯誤就好多了:
File "<input>", line 5, in <module>
File "<input>", line 2, in func
NameError: name 'xx' is not defined. Did you mean: 'xxx'?
您可以使用traceback
和sys
modules 來獲得高級 traceback output,就像您希望的那樣。
這是一個例子:
import traceback
import sys
def func():
zeroDivide = 1 / 0
try:
func()
except Exception:
print(traceback.format_exc()) # This line is for getting traceback.
print(sys.exc_info()[2]) # This line is getting for the error type.
Output 將是:
Traceback (most recent call last):
File "b:\abc\1234\pppp\main.py", line 10, in <module>
func()
File "b:\abc\1234\pppp\main.py", line 7, in func
zeroDivide = 1 / 0
ZeroDivisionError: division by zero
您可以使用 traceback 模塊來獲取錯誤的行號,
import traceback
def function():
try:
# code
except:
tb_list = traceback.extract_tb(sys.exc_info()[2])
line_number = tb_list[-1][1]
print("An error occurred on line:", line_number)
您可以使用traceback.extract_tb()
function。此 function 返回一個回溯對象列表,每個對象都包含有關堆棧跟蹤的信息。 此列表的最后一個元素tb_list[-1]
包含有關發生異常的行的信息。 要訪問行號,您可以使用此元組的第二個元素tb_list[-1][1]
。 然后可以使用print()
function 打印此值。
要將行號作為 int 獲取,您可以從traceback.extract_tb()
獲取作為列表的回溯。 查看最后一項會為您提供引發異常的行:
#soPrintLineOfError2
import sys
import traceback
def func():
if xx == 1:
print('ok')
try:
func()
except Exception as e:
tb = sys.exc_info()[2]
ss = traceback.extract_tb(tb)
ss1 = ss[-1]
print(ss1.line)
print(ss1.lineno)
Output:
if xx == 1:
6
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.