我正在清理一个API库,并试图找出处理未处理的异常的最佳方法。如何处理未处理的异常?
现在,图书馆捕捉到所有可能出现错误的API - 凭证错误,服务器错误,urllib2错误,httplib错误等等。将会出现边缘情况。
我目前的想法是,99%的图书馆用户不关心异常本身,他们只关心API调用失败。只有开发人员会关心这个异常。
这使我这个解决方案:
class ApiError(Exception):
pass
class ApiUnhandledError(ApiError):
pass
与API的已知问题引发ApiError中或特定的子类。
其他一切都会引发一个ApiUnhandledError,原始错误被隐藏,用户可以捕获或忽略该错误。
try:
stuff
except urllib2.UrlError , e :
raise ApiError(raised=e)
except Exception as e :
raise ApiUnhandledError(raised=e)
这听起来像是一种确保用户只知道通过/失败的好方法,而开发人员可以维护一种支持方法吗?
更新
基于最佳实践的共识,我不会捕捉这一点。
原来的目标是让人们能够做到这一点:
try:
stuff_a
other_stuff
even_more_stuff
api.proxy(url)
again_stuff
again_others
except api.ApiUnhandledError , e :
handle error
except api.ApiError , e :
handle error
except Stuff , e :
other error
except:
raise
在这个例子中,用户只赶上ApiError中(以及可选ApiUnhandledError或任何其他子类)
我想这将有自己的块在很大程度上最好每个API互动:
try:
stuff_a
other_stuff
even_more_stuff
try:
api.proxy(url)
except api.ApiError , e :
handle error
except CatchSomething1 , e :
handle error
except CatchSomething2 , e :
handle error
except CatchSomething3 , e :
handle error
except CatchSomething4 , e :
handle error
except:
raise
again_stuff
again_others
except Stuff , e :
other error
except:
raise
与urllib2的问题时,我已经似乎发现了新的除外离子每天。这些例外往往会变得很长,难以维持。
您确定要使用此类机制吗?你只会用你的“假”来掩盖一个真正的例外。我只是留下未经处理的例外,因为它们是最具信息性的方式。如果你想将它们记录在某处或创建一个普通的动作,那就是另一回事了。 – Michal 2013-05-07 14:34:41
我不确定我想要这样做。我担心的是有一些错误代码可能会从底层库中弹出。看看使用这个库的我自己的“消费者”代码,我不得不在自己的块中嵌入对这个库的调用,然后在它周围链接大量的异常处理来捕获这些错误。我试图在上游端口处理这个异常处理,这似乎是一种可能的方式来最大限度地减少大多数消费者的工作,同时仍然保留例外情况。 – 2013-05-07 14:42:18