我一直在开发一个Python项目,它已经变得相当庞大,并且有几层函数。由于一些愚蠢的初期决策,我发现我必须修复很多崩溃问题,因为较低层的函数返回了高级函数中未预期的类型(通常是None)。
在我进行清理之前,我想知道指示错误条件并在更高级别的函数中处理它们的最pythonic的方法是什么?
对于大部分情况下,我所做的是,如果一个函数无法完成并返回其预期结果,我将返回None。这会变得有点麻烦,因为你最终不得不始终检查所有调用它的函数是否为None。
def lowLevel():
## some error occurred
return None
## processing was good, return normal result string
return resultString
def highLevel():
resultFromLow = lowLevel()
if not resultFromLow:
return None
## some processing error occurred
return None
## processing was good, return normal result string
return resultString
我想另一个解决方案可能是抛出异常。这样,调用函数中仍然会有很多代码来处理异常。
似乎没有特别优雅的解决方案。其他人使用什么?在obj-c中,常见的模式是通过引用返回错误参数,然后调用方进行检查。
urllib2.HTTPError
(服务器端处理错误)、urllib2.URLError
(URL错误、终端点关闭)、ValueError
(URL无法解析或缺失)、httplibInvalidURL
(URL可解析但无效),在极少数情况下,还可能出现其他错误。如果我不处理这些错误,那么我的调用者就必须处理它们。很丑陋!相反,我捕获它们所有,引发ConnectionError,并根据需要添加上下文字符串。 - ire_and_curseslow_level
引发异常,则它已经失败了。您仍然可以在调用堆栈的更高位置捕获它并进一步处理它。 - Ethan Furman