Существует ли кроссплатформенный способ получения информации из OSError в Python? - PullRequest
41 голосов
/ 08 ноября 2008

Например, для простой операции создания каталога я могу сделать OSError следующим образом:

(Ubuntu Linux)

>>> import os
>>> os.mkdir('foo')
>>> os.mkdir('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 17] File exists: 'foo'

Теперь я могу уловить эту ошибку следующим образом:

>>> import os
>>> os.mkdir('foo')
>>> try:
...     os.mkdir('foo')
... except OSError, e:
...     print e.args
... 
(17, 'File exists')

Есть ли кросс-платформенный способ, которым я могу знать, что 17 или «Файл существует» всегда будут означать одно и то же, чтобы я мог действовать по-разному в зависимости от ситуации?

(Это возникло во время другого вопроса .)

1 Ответ

56 голосов
/ 08 ноября 2008

Атрибут errno в ошибке должен быть одинаковым на всех платформах. Вы получите WindowsError исключения в Windows, но, поскольку это подкласс OSError, тот же самый блок "except OSError:" перехватит его. У Windows есть свои собственные коды ошибок, и они доступны как .winerror, но атрибут .errno все еще должен присутствовать и использоваться кроссплатформенным способом.

Символьные имена для различных кодов ошибок можно найти в модуле errno. Например,

import os, errno
try:
    os.mkdir('test')
except OSError, e:
    if e.errno == errno.EEXIST:
        # Do something

Вы также можете выполнить обратный поиск (чтобы узнать, какой код вы должны использовать) с помощью errno.errorcode. То есть:

>>> errno.errorcode[17]
'EEXIST'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...