2

我有一些代码可以解析文件。这很简单,就像这样:

for line in config_file:
    line_split=line.split("|")
    pid_index = int(line_split[3])
    date_locations = [int(i) for i in line_split[2].split(",")]
    in_file = line_split[0]
    out_file = line_split[1]
    file_info.append([in_file, out_file, date_locations, pid_index])

如果发生某些事情,我希望 Python 继续打印其通常的错误消息,但我想在常规错误消息的末尾添加一行,例如:

except:
    print "line \"{0}\"  might have failed to parse".format(line.rstrip())

然而,上面的代码只显示了额外的信息行——常规的错误信息被覆盖了!

我尝试将以下内容添加到我的捕获中,但它会产生丑陋的输出:

e = sys.exc_info()
for i in e:
    print i

有没有一种简单的方法让 Python 打印常规错误消息以及我选择的附加信息行?

4

3 回答 3

3

我认为这里最好的选择(并且我在此编辑中删除了我的其他解决方案,因为我觉得它实际上不是一个很好的解决方案)是创建您自己的异常来描述您的问题,然后在您拥有的异常之上使用它:

class ParseFailureError(Exception):
    def __init__(self, line):
        self.line = line.rstrip()

    def __str__(self):
        return "line \"{0}\"  might have failed to parse".format(self.line)

然后:

try:
    ...
except SomeException as exception:
    raise ParseFailureError(line) from exception

这将产生类似的东西:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
NameError: name 'x' is not defined

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
__main__.ParseFailureException: line "blah" might have failed to parse

(我用 aNameError作为SomeError例子)

请注意,我在您的except行中添加了一个特定的异常 - 这总是值得做的,因为捕获任何异常都可能导致您忽略您不希望的错误。

此方法的优点是使您的代码更易于其他软件使用,因为它们可以捕获此特定异常。

异常的from语法告诉 Python 异常的根本原因。否则,Python 将假定新异常是在处理异常期间发生的错误。请注意,这仅在 Python 3.x 中可用,在早期版本中,您必须手动执行此操作。我建议使用traceback.format_exc()then 打印它作为异常错误消息的一部分。

于 2012-12-02T20:14:21.460 回答
2

except抑制错误。你想抓住它来打印你的额外信息——然后让它再次回来。你这样做

try:
    raise ValueError("I do not like green eggs and ham")
except ValueError as e:
    print("OK, actually I do.")
    raise

在 Python 2.x 中,一次只能抛出一个异常。在 Python 3 中,您可以

raise ValueError("OK, actually I do.") from e

表示此错误是由前一个错误引起的。

于 2012-12-02T20:14:00.183 回答
2

您可以使用日志记录模块

import sys
import logging
logging.basicConfig(level = logging.DEBUG)
logger = logging.getLogger(__name__)

config_file = """\
foo bar
""".splitlines()
try:
    for line in config_file:
        line_split=line.split("|")
        pid_index = int(line_split[3])
        date_locations = [int(i) for i in line_split[2].split(",")]
        in_file = line_split[0]
        out_file = line_split[1]
        file_info.append([in_file, out_file, date_locations, pid_index])
except IndexError as err:
    logger.exception('line {l!r} might have failed to parse'.format(
        l = line.rstrip()))    
    sys.exit()

产量

ERROR:__main__:line 'foo bar' might have failed to parse
Traceback (most recent call last):
  File "/home/unutbu/pybin/test2.py", line 15, in <module>
    pid_index = int(line_split[3])
IndexError: list index out of range
于 2012-12-02T20:24:19.223 回答