Как обрабатывать разные исключения, возникающие в разных версиях Python

1

Попытка разобрать искаженный XML-контент с помощью xml.etree.ElementTree.parse() вызывает другое исключение в 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 (аналогично тому, что мы могли бы сделать С#ifdef в C/С++). Единственный способ, с помощью которого я могу справиться с обоими исключениями, - поймать общее родительское исключение обоих (например, исключение). Однако это не идеально, потому что другие исключения будут обрабатываться в одном блоке catch. Есть ли другой способ?

  • 0
    Из того, что я могу сказать, на python2.7 эти два класса не имеют общего предка выше Exception что еще больше подчеркивает ваше желание не перехватывать общее родительское исключение ...
  • 0
    Вы можете поместить несколько блоков исключений для одного и того же блока try.
Показать ещё 3 комментария
Теги:
exception-handling

2 ответа

3
Лучший ответ

Это не очень, но он должен быть работоспособен...

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

try:
    ...
except ParseError:
    ...

Вам может потребоваться изменить то, что вы импортируете, на основе версий (или catch ImportError при импорте различных подмодулей из xml, если они не существуют на python2.6 - у меня нет установленной версии, поэтому я не могу сделать надежный тест на данный момент...)

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>
  • Определить ParseError во время выполнения в зависимости от версии Python. Выводить версию Infer Python из исключения ImportError или нет
  • Добавить директивы disable disable, чтобы не нарушить проверку Pylint
  • По какой-то причине, если импортирован только xml, ParseError = xml.etree.ElementTree.ParseError и ParseError = xml.parsers.expat.ExpatError сбой; промежуточный импорт модулей etree и expat устанавливает, что

Ещё вопросы

Сообщество Overcoder
Наверх
Меню