Обработка специфичных для Windows исключений независимо от платформы - PullRequest
8 голосов
/ 31 июля 2009

Рассмотрим следующее исключение Python:

  [...]
    f.extractall()
  File "C:\Python26\lib\zipfile.py", line 935, in extractall
    self.extract(zipinfo, path, pwd)
  File "C:\Python26\lib\zipfile.py", line 923, in extract
    return self._extract_member(member, path, pwd)
  File "C:\Python26\lib\zipfile.py", line 957, in _extract_member
    os.makedirs(upperdirs)
  File "C:\Python26\lib\os.py", line 157, in makedirs
    mkdir(name, mode)
WindowsError: [Error 267] The directory name is invalid: 'C:\\HOME\\as\
\pypm-infinitude\\scratch\\b\\slut-0.9.0.zip.work\\slut-0.9\\aux'

Я хочу обработать это конкретное исключение - то есть WindowsError с ошибкой 267. Однако я не могу просто сделать следующее:

try:
    do()
except WindowsError, e:
    ...

Потому что это не будет работать в системах Unix, где WindowsError даже не определена в модуле исключений.

Есть ли элегантный способ справиться с этой ошибкой?

Ответы [ 3 ]

13 голосов
/ 31 июля 2009

Если вам нужно перехватить исключение с именем, которое не всегда существует, создайте его:

if not getattr(__builtins__, "WindowsError", None):
    class WindowsError(OSError): pass

try:
    do()
except WindowsError, e:
    print "error"

Если вы работаете в Windows, вы будете использовать настоящий класс WindowsError и поймать исключение. Если вы этого не сделаете, вы создадите класс WindowsError, который никогда не будет вызываться, поэтому предложение исключение не вызывает ошибок, а предложение исключение никогда не будет вызвано.

4 голосов
/ 31 июля 2009

Вот мое текущее решение, но я немного презираю использование нетривиального кода в блоке исключений:

        try:
            f.extractall()
        except OSError, e:
            # http://bugs.python.org/issue6609
            if sys.platform.startswith('win'):
                if isinstance(e, WindowsError) and e.winerror == 267:
                    raise InvalidFile, ('uses Windows special name (%s)' % e)
            raise
1 голос
/ 20 декабря 2016

@ Ответ Гленна Мейнарда не разрешает отладку с помощью pdb, поскольку встроенная функция WindowsError недоступна в отладчике. Этот блок кода будет работать внутри отладчика Python и при обычном выполнении:

import exceptions

if not getattr(exceptions, "WindowsError", None):
        class WindowsError(OSError): pass

Это решение также работает и позволяет избежать строковых литералов и импорта библиотеки полных исключений:

try:
    from exceptions import WindowsError
except ImportError:
    class WindowsError(OSError): pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...