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

Cam*_*son 7 python architecture exception-handling exception

我有许多函数可以解析文件中的数据,通常会返回结果列表.

如果我在文件中遇到一个狡猾的行,我想继续并处理有效行,并返回它们.但我也想将错误报告给调用函数.我想报告它的原因是调用函数可以通知用户该文件需要查看.我不想在解析函数中开始做GUI事情,因为这似乎是对关注点分离的重大违反.解析函数无法访问控制台我正在编写错误消息.

这让我想要返回成功的数据,但也因为错误而引发异常,这显然是我无法做到的.

考虑以下代码:

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")
Run Code Online (Sandbox Code Playgroud)

显然最后三行没有任何意义,但我无法找到一个很好的方法来做到这一点.我想我能做到return (err, result),并称之为

parseErr, parseResult = parse(file)
if parseErr:
    HandleErrorsSomehow()
Run Code Online (Sandbox Code Playgroud)

但返回错误代码似乎不够pythonic,更不用说返回错误代码和实际结果值的元组.

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

Hen*_*olm 7

没有人说处理"错误" 的唯一有效方法是抛出异常.

在您的设计中,调用者需要两条信息:(1)有效数据,(2)是否发生错误(可能是出现错误的地方,因此它可以格式化有用的错误消息).这是一个完全有效且基于地面的情况,用于返回一对值.

另一种设计是通过可变集合下降到函数作为参数,让它填补它要发射到的任何错误消息.这通常会简化调用程序中的管道,特别是如果解析器和代码之间存在多层调用,后者知道如何对错误消息执行某些操作.