关于python异常处理:python异常处理-行号

Python exception handling - line number

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

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

1
2
3
4
5
try:
    result = evaluateData(data)
except Exception, err:
    print ("Error: %s.
"
% str(err))

不幸的是,这只告诉我存在和索引错误。我想知道关于异常的更多细节(代码中的行、变量等),以了解发生了什么。有可能吗?

谢谢您。


解决方案,打印文件名、行号、行本身和异常说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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()

输出:

1
EXCEPTION IN (D:/Projects/delme3.py, LINE 15"print 1/0"): integer division or modulo by zero


为了简单地得到您可以使用sys的行号,如果您想要更多,请尝试使用回溯模块。

1
2
3
4
5
import sys    
try:
    [][2]
except IndexError:
    print 'Error on line {}'.format(sys.exc_info()[-1].tb_lineno)

印刷品:

1
Error on line 3

来自traceback模块文档的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import sys, traceback

def lumberjack():
    bright_side_of_death()

def bright_side_of_death():
    return tuple()[0]

try:
    lumberjack()
except IndexError:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    print"*** print_tb:"
    traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)
    print"*** print_exception:"
    traceback.print_exception(exc_type, exc_value, exc_traceback,
                              limit=2, file=sys.stdout)
    print"*** print_exc:"
    traceback.print_exc()
    print"*** format_exc, first and last line:"
    formatted_lines = traceback.format_exc().splitlines()
    print formatted_lines[0]
    print formatted_lines[-1]
    print"*** format_exception:"
    print repr(traceback.format_exception(exc_type, exc_value,
                                          exc_traceback))
    print"*** extract_tb:"
    print repr(traceback.extract_tb(exc_traceback))
    print"*** format_tb:"
    print repr(traceback.format_tb(exc_traceback))
    print"*** tb_lineno:", exc_traceback.tb_lineno


最简单的方法就是使用:

1
2
3
4
5
import traceback
try:
    <blah>
except IndexError:
    traceback.print_exc()

或者如果使用日志记录:

1
2
3
4
5
import logging
try:
    <blah>
except IndexError as e:
    logging.exception(e)

我使用的EDOCX1[1]简单而健壮:

1
2
3
4
5
6
import traceback

try:
    raise ValueError()
except:
    print(traceback.format_exc())

出:

1
2
3
4
Traceback (most recent call last):
  File"catch.py", line 4, in <module>
    raise ValueError()
ValueError