如何处理在不同Python版本中引发的不同异常

时间:2016-04-20 19:00:55

标签: python xml exception-handling

尝试使用xml.etree.ElementTree.parse()解析格式错误的XML内容会在Python 2.6.6和Python 2.7.5中引发不同的异常

Python 2.6:xml.parsers.expat.ExpatError

Python 2.7:xml.etree.ElementTree.ParseError

我正在编写必须在Python 2.6和2.7中运行的代码。 afaik没有办法定义只在Python中用Python版本运行的代码(类似于我们在C / C ++中用#ifdef做的事情)。我看到处理这两个异常的唯一方法是捕获两者的共同父异常(例如Exception)。但是,这并不理想,因为其他异常将在同一个catch块中处理。还有其他办法吗?

2 个答案:

答案 0 :(得分:3)

这不是很漂亮,但它应该可行......

ParseError = xml.parsers.expat.ExpatError if sys.version < (2, 7) else xml.etree.ElementTree.ParseError

try:
    ...
except ParseError:
    ...

可能需要根据版本修改您导入的内容(或者在ImportError导入各种子模块时捕获xml,如果它们不存在于python2上.6 - 我没有安装该版本,因此我暂时无法进行强大的测试......)

答案 1 :(得分:0)

根据mgilson的回答:

from xml.etree import ElementTree

try:
    # python 2.7+
    # pylint: disable=no-member
    ParseError = ElementTree.ParseError
except ImportError:
    # python 2.6-
    # pylint: disable=no-member
    from xml.parsers import expat
    ParseError = expat.ExpatError

try:
    doc = ElementTree.parse(<file_path>)
except ParseError:
    <handle error here>
  • 根据Python的版本在运行时定义ParseError。从引发的ImportError异常推断Python版本
  • 添加pylint禁用指令以不破坏Pylint验证
  • 由于某种原因,如果仅导入xml,则ParseError = xml.etree.ElementTree.ParseError和ParseError = xml.parsers.expat.ExpatError失败; etree和expat模块的中间导入修复了