Python:如何在异常捕获中避免代码重复?

时间:2011-10-10 12:21:08

标签: python exception exception-handling

在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())

我应该选择哪一种,还有另一种更好的方法吗?

1 个答案:

答案 0 :(得分:10)

我认为你的第三个例子是最好的解决方案。

  • 这是最短的版本
  • 避免重复
  • 很明显,阅读和易于理解,与第二版不同。

但是,如果您使用的是Python 2.6或更高版本,则可能需要使用较新的except FooError as err语法。

此外,在您的示例中,第一个版本不太正确,因为URLError处理程序已经捕获HTTPError,因此永远不会到达except HTTPError部分。你必须切换两个except。另一个不使用它的原因。