Python异常处理-行号
我正在使用python评估一些测量数据。由于许多可能的结果,很难处理或处理可能的组合。有时在评估过程中会发生错误。这通常是一个索引错误,因为我从测量数据中得到了超出范围的数据 很难找出问题发生在代码中的哪个位置。如果我知道错误是在哪一行引起的,那会有很大帮助。如果我使用以下代码:Python异常处理-行号,python,exception,indexing,Python,Exception,Indexing,我正在使用python评估一些测量数据。由于许多可能的结果,很难处理或处理可能的组合。有时在评估过程中会发生错误。这通常是一个索引错误,因为我从测量数据中得到了超出范围的数据 很难找出问题发生在代码中的哪个位置。如果我知道错误是在哪一行引起的,那会有很大帮助。如果我使用以下代码: try: result = evaluateData(data) except Exception, err: print ("Error: %s.\n" % str(err)) 不幸的是,这只告诉我
try:
result = evaluateData(data)
except Exception, err:
print ("Error: %s.\n" % str(err))
不幸的是,这只告诉我存在和索引错误。我想知道有关异常的更多细节(代码中的行、变量等),以了解发生了什么。可能吗
谢谢。要简单地获取行号,您可以使用
sys
,如果您想要更多,请尝试该模块
印刷品:
:
解决方案、打印文件名、行号、行本身和异常描述:
import linecache
import sys
def PrintException():
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 'EXCEPTION IN ({}, LINE {} "{}"): {}'.format(filename, lineno, line.strip(), exc_obj)
try:
print 1/0
except:
PrintException()
输出:
EXCEPTION IN (D:/Projects/delme3.py, LINE 15 "print 1/0"): integer division or modulo by zero
最简单的方法就是使用:
import traceback
try:
<blah>
except IndexError:
traceback.print_exc()
导入回溯
尝试:
除索引器外:
traceback.print_exc()
或者,如果使用日志记录:
import logging
try:
<blah>
except IndexError as e:
logging.exception(e)
导入日志
尝试:
除索引器e外:
logging.exception(e)
我使用了简单而可靠的回溯功能:
import traceback
try:
raise ValueError()
except:
print(traceback.format_exc())
输出:
回溯(最近一次呼叫最后一次):
文件“catch.py”,第4行,在
提升值错误()
数值误差
我建议使用python日志库,它有两种有用的方法,在这种情况下可能会有所帮助
logging.findCaller()
- findCaller(stack_info=False)-只报告导致引发异常的前一个调用方的行号
- findCaller(stack_info=True)-报告导致引发异常的前一个调用方的行号和堆栈
logging.logException()
- 报告引发异常的try/except块中的行和堆栈
有关更多信息,请查看api我始终使用此代码段
import sys, os
try:
raise NotImplementedError("No error")
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
print(exc_type, fname, exc_tb.tb_lineno)
对于不同的视图和可能出现的问题,您可以参考为您提供了调用堆栈中最后一项的文件、行号和异常
来自系统导入exc\u信息
从回溯导入格式\u异常
def print_异常():
etype,value,tb=exc_info()
info,error=format\u异常(etype,value,tb)[-2:]
打印(f'Exception in:\n{info}\n{error}')
尝试:
1/0
除:
打印异常()
印刷品
中的异常:
文件“File.py”,第12行,在
1/0
ZeroDivision错误:被零除
请参见@杰奇:答案看起来不错。请接受一个。要接受它,请单击答案旁边的空复选标记。此处投票最高的答案也出现在上面@CharlesBeattie引用的stackoverflow问题中。该答案有与之相关的重要评论,而该答案没有。这绝对值得你花时间去看看。这能回答你的问题吗?对于我的Python3.6.5,我需要使用print:print({},line{}{}”):{}格式(filename,lineno,line.strip(),exc_obj)将paren添加到最后一行,这提供了stacktrace中第一个文件的信息。但大多数情况下,您需要最后一个,因为这是实际发生错误的地方。我们如何获取最后一个@reubano@alper看,这是最好的答案。当错误在函数内部时,其他函数不能正确显示错误行
import logging
try:
<blah>
except IndexError as e:
logging.exception(e)
import traceback
try:
raise ValueError()
except:
print(traceback.format_exc())
Traceback (most recent call last):
File "catch.py", line 4, in <module>
raise ValueError()
ValueError
import sys, os
try:
raise NotImplementedError("No error")
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
print(exc_type, fname, exc_tb.tb_lineno)