Например, при простой операции создания каталога я могу сделать ошибку 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 или «Файл существует» всегда будет означать одно и то же, так что я могу действовать по-разному в зависимости от ситуации?
(Это подошло во время другого вопроса.)






Атрибут 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'
@ford Можете ли вы опубликовать тестовый ответ, если каталог существует сначала, а затем повторно поднял ошибку после попытки создания? Все это кажется слишком сложным. В Linux я бы использовал mkdir -p ~/.config/mserve для своих целей. Я не уверен, что эквивалент ~ в Windows. Трудно поверить, что переполнение стека не дает однозначного ответа для создания каталога в Python ...
Я полагаю, что здесь дан ответ на первую часть вашего вопроса: stackoverflow.com/a/600612/576932
Вероятно, неплохо было бы затем повторно вызвать исходное исключение, если это не был
EEXIST.