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

Ber*_*ard 9 python exception-handling exception

在Python中处理不同的异常类型时,避免代码重复的好方法是什么,例如.我想要处理URLError和HTTPError模拟但不完全:

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())
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我想避免重复第一次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
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用例如.如果URLError和HTTPError不在继承链中:

except (URLError, HTTPError), err:
    logger.error("An error occured %s", err)
    if isinstance(err, HTTPError):
         logger.error("Error message: %s", err.read())
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*ker 10

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

  • 这是最短的版本
  • 它避免了重复
  • 与第二个版本不同,它易于阅读并且易于理解.

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

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