Подтвердить что ты не робот

Повышение встроенного исключения с сообщением по умолчанию в python

Я пытаюсь реализовать метод, который возвращает ошибку всякий раз, когда определенный каталог не существует.

Вместо того, чтобы делать raise OSError("Directory does not exist."), однако, я хочу использовать встроенное сообщение об ошибке из OSError: OSError: [Errno 2] No such file or directory:. Это связано с тем, что я увеличиваю исключение в начале вызова метода, а не позже (что вызовет одно и то же сообщение из python без каких-либо необходимых raise).

Любые указатели? (кроме ручного выполнения OSError("[Errno 2] No such file or directory: "))

4b9b3361

Ответ 1

import os

try:
    open('foo')
except IOError as err:
    print(err)
    print(err.args)
    print(err.filename)    

производит

[Errno 2] No such file or directory: 'foo'
(2, 'No such file or directory')
foo

Итак, для создания OSError с аналогичным сообщением используйте

raise OSError(2, 'No such file or directory', 'foo')

Ответ 2

Чтобы получить сообщение об ошибке для данного кода ошибки, вы можете использовать os.strerror:

>>> os.strerror(2)
'No such file or directory'

Кроме того, вы можете использовать errno для использования стандартных сокращений для этих ошибок:

>>> errno.ENOENT
2
>>> os.strerror(errno.ENOENT)
'No such file or directory'

Ответ 3

Я думаю, что "исключение" - это термин языка Python для того, что вы называете "ошибкой". Поэтому используйте этот термин при поиске дополнительной информации.

Вам может показаться полезным прочитать Документацию по стандартной библиотеке Python, "6. Встроенные исключения" .

OSError является одним из встроенных исключений. Он определен в разделе "Встроенные исключения", который добавляет: "Атрибут errno - это числовой код ошибки из errno, а атрибут strerror - соответствующая строка, как было бы напечатано функцией C perror() См. Модуль errno, который содержит имена кодов ошибок, определенных базовой операционной системой."

Запуск этого кода:

raise OSError(42, "my exception string", "no_such_file.dat")

дает мне этот результат:

Traceback (most recent call last):
  Line 1, in <module>
    raise OSError(42, "my exception string", "no_such_file.dat")
OSError: [Errno 42] my exception string: 'no_such_file.dat'

Итак, я думаю, что ваш код мог бы сделать что-то вроде:

raise OSError(2, "No such file or directory", filename)

Ответ 4

Я думаю, что настоящая проблема заключается в том, что вы, вероятно, делаете кучу проверок заранее, а не просто пытаетесь.

try:
    [CODE]
except Exception:
    [HANDLING CODE]

намного лучше, чем:

if [SPECIAL CASE]:
    [HANDLING CODE]
elif [special case]:
    [SPECIAL CASE]
[CODE]

Ответ 5

try:
    # ...
except OSError:
    raise OSError("your answer")