Существует ли межплатформенный способ получения информации из Python OSError?

В простой операции создания каталога, например, я могу сделать 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

Атрибут 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'