Как обрабатывать OSError: [Errno 36] Имя файла слишком длинное
При обработке ошибок, возникающих при попытке создать существующий файл или при использовании файла, который не существует, OSError
S, которые бросают есть подкласс (FileExistsError
, FileNotFoundError
). Я не смог найти этот подкласс для особого случая, когда имя файла слишком длинное.
Точное сообщение об ошибке:
OSError: [Errno 36] File name too long: 'filename'
Я хотел бы поймать OSError, которая возникает, когда имя файла слишком длинное, но только когда имя файла слишком длинное. Я не хочу ловить других OSError
с, что может произойти. Есть ли способ добиться этого?
Редактировать: я знаю, что могу проверить имя файла по длине, но максимальная длина имени файла слишком сильно зависит от операционной системы и файловой системы, и я не вижу "чистого" решения таким образом.
2 ответа
Просто проверь errno
атрибут пойманного исключения.
try:
do_something()
except OSError as exc:
if exc.errno == 36:
handle_filename_too_long()
else:
raise # re-raise previously caught exception
Для удобства чтения вы можете использовать соответствующую константу из errno
встроенный модуль вместо жестко закодированной константы.
Вы можете указать, как именно вы хотите поймать конкретную ошибку, например, errno.ENAMETOOLONG:
Специфично для вашего вопроса...
try:
# try stuff
except OSError as oserr:
if oserr.errno != errno.ENAMETOOLONG:
# ignore
else:
# caught...now what?
Конкретно для ваших комментариев...
try:
# try stuff
except Exception as err:
# get the name attribute from the exception class
errname = type(err).__name__
# get the errno attribute from the exception class
errnum = err.errno
if (errname == 'OSError') and (errnum == errno.ENAMETOOLONG):
# handle specific to OSError [Errno 36]
else if (errname == 'ExceptionNameHere' and ...:
# handle specific to blah blah blah
.
.
.
else:
raise # if you want to re-raise; otherwise code your ignore
Это захватит все исключения, вызванные ошибками в try
, Затем он проверяет, если __name__
соответствует любому конкретному исключению и любым дополнительным условиям, которые вы хотите указать.
Вы должны знать, что нет никакого обхода except
если возникает ошибка, если вы не указали конкретное исключение.