我想返回一个值并引发一个异常,这是否意味着我做错了什么?

2024-09-28 23:44:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有很多函数可以解析文件中的数据,通常返回结果列表。在

如果我在文件中遇到一个不可靠的行,我想继续处理有效的行,然后返回它们。但我还想向调用函数报告错误。我要报告它的原因是,调用函数可以通知用户文件需要查看。我不想在parse函数中开始做GUI操作,因为这似乎严重违反了关注点分离。parse函数无法访问我正在向其写入错误消息的控制台。在

这使得我想要返回成功的数据,但也因为错误而引发了一个异常,这显然是我做不到的。在

考虑以下代码:

try:
    parseResult = parse(myFile)
except MyErrorClass, e:
    HandleErrorsSomehow(str(e))

def parse(file): #file is a list of lines from an actual file
    err = False
    result = []

    for lines in file:
        processedLine = Process(line)
        if not processedLine:
            err = True
        else
            result.append(processedLine)
    return result
    if err:
        raise MyErrorClass("Something went wrong")

很明显最后三行没有意义,但我想不出一个好的方法来做这件事。我想我可以这样叫它

^{pr2}$

但是返回错误代码似乎已经不是python了,更不用说返回错误代码和实际结果值的元组了。在

事实上,我觉得我想在一个不应该太复杂的应用程序中做一些奇怪的事情,这让我觉得我可能做错了什么。这个问题有更好的解决办法吗?或者有什么方法可以使用finally来返回值并同时引发异常?在


Tags: 文件数据方法函数ifparse报告错误
3条回答

另一种可能的设计是通过将错误处理程序作为参数传入来反转控制。在

(另外,不要觉得必须告诉Python如何在列表中积累数据。它已经知道了。在这里,列表理解并不难

def sample_handler():
    print "OMG, I wasn't expecting that; oh well."

parseResult = parse(myFile, sample_handler)

def parse(file, handler): #file is a list of lines from an actual file
    result = [Process(line) for line in data]
    if not all(result): handler() # i.e. if there are any false-ish values
    result = filter(None, result) # remove false-ish values if any
    return result

没有人说处理“错误”的唯一有效方法是抛出异常。在

在您的设计中,调用者需要两条信息:(1)有效数据,(2)是否发生错误(可能还有关于哪里出错的信息,以便它可以格式化有用的错误消息)。对于返回一对值来说,这是一个完全有效的、超出实际的情况。在

另一种设计是将一个可变集合作为参数传递给函数,并让它将它希望发出的任何错误消息填充到函数中。这通常会简化调用程序中的管道,特别是在解析器和代码之间存在多层调用的情况下,这些代码知道如何在以后处理错误消息。在

改为Emit a warning,并让代码决定如何处理它。在

相关问题 更多 >