Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python异常处理-行号_Python_Exception_Indexing - Fatal编程技术网

Python异常处理-行号

Python异常处理-行号,python,exception,indexing,Python,Exception,Indexing,我正在使用python评估一些测量数据。由于许多可能的结果,很难处理或处理可能的组合。有时在评估过程中会发生错误。这通常是一个索引错误,因为我从测量数据中得到了超出范围的数据 很难找出问题发生在代码中的哪个位置。如果我知道错误是在哪一行引起的,那会有很大帮助。如果我使用以下代码: try: result = evaluateData(data) except Exception, err: print ("Error: %s.\n" % str(err)) 不幸的是,这只告诉我

我正在使用python评估一些测量数据。由于许多可能的结果,很难处理或处理可能的组合。有时在评估过程中会发生错误。这通常是一个索引错误,因为我从测量数据中得到了超出范围的数据

很难找出问题发生在代码中的哪个位置。如果我知道错误是在哪一行引起的,那会有很大帮助。如果我使用以下代码:

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)