簡體   English   中英

如何使用 except in Python 打印 function 中的錯誤行號?

[英]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'?

您可以使用tracebacksys 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM