在Python中处理不同的异常类型时,避免代码重复的好方法是什么,例如。我想要处理URLError和HTTPError simlar但不完全:
try:
page = urlopen(request)
except URLError, err:
logger.error("An error ocurred %s", err)
except HTTPError, err:
logger.error("An error occured %s", err)
logger.error("Error message: %s", err.read())
在这个例子中,我想避免重复第一次logger.error调用。鉴于URLError是HTTPError的父级,可以执行以下操作:
except URLError, err:
logger.error("An error occurred %s", err)
try:
raise err
except HTTPError, err:
# specialization for http errors
logger.error("Error message: %s", err.read())
except:
pass
另一种方法是使用isinstance,例如。如果URLError和HTTPError不在继承链中:
except (URLError, HTTPError), err:
logger.error("An error occured %s", err)
if isinstance(err, HTTPError):
logger.error("Error message: %s", err.read())
我应该选择哪一种,还有另一种更好的方法吗?
答案 0 :(得分:10)
我认为你的第三个例子是最好的解决方案。
但是,如果您使用的是Python 2.6或更高版本,则可能需要使用较新的except FooError as err
语法。
此外,在您的示例中,第一个版本不太正确,因为URLError
处理程序已经捕获HTTPError
,因此永远不会到达except HTTPError
部分。你必须切换两个except
。另一个不使用它的原因。