D.C*_*.C. 5 python error-handling python-3.x
我一直在研究一个有点大的Python项目,它有几层功能.由于一些愚蠢的早期决定,我发现我必须修复很多crashers因为较低级别的函数返回了一个我没想到的更高级别函数的类型(通常是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
Run Code Online (Sandbox Code Playgroud)
我想另一个解决方案可能是抛出异常.有了这个,您仍然可以在调用函数中获得大量代码来处理异常.
似乎没有什么超级优雅.其他人使用什么?在obj-c中,常见的模式是通过引用返回错误参数,然后调用者检查它.
这实际上取决于你想要做什么,因为这个处理无法完成.如果这些是普通控制流程的真正例外,并且您需要清理,拯救,向人们发送电子邮件等,那么异常就是您想要抛出的内容.在这种情况下,处理代码只是必要的工作,并且基本上是不可避免的,尽管你可以重新抛出堆栈并在一个地方处理错误以保持它更整洁.
如果可以容忍这些错误,那么一个优雅的解决方案是使用Null对象模式.而不是返回None,而是返回一个对象,该对象模仿通常会返回的真实对象的接口,但不会做任何事情.这允许故障下游的所有代码继续运行,而忽略了失败的事实.这种模式的主要缺点是它可能很难发现真正的错误,因为你的代码不会崩溃,但在运行结束时可能不会产生任何有用的东西.
Python中Null对象模式的一个常见示例是当您的低级函数出现空白时返回空列表或字典.使用此返回值并迭代元素的任何后续函数都将以静默方式进行,而无需进行错误检查.当然,如果由于某种原因要求列表至少包含一个元素,那么这将无效,并且您将再次处理异常情况.