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

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