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

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

Вместо того, чтобы делать 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: "))

Ответы [ 5 ]

25 голосов
/ 24 января 2012
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')
11 голосов
/ 24 января 2012

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

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

Также вы можете использовать errno* Модуль 1009 * для использования стандартных сокращений для этих ошибок:

>>> errno.ENOENT
2
>>> os.strerror(errno.ENOENT)
'No such file or directory'
2 голосов
/ 24 января 2012

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

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

OSError является одним из встроенных исключений.Он определен в разделе «Встроенные исключения», в котором добавлено: «Атрибут errno представляет собой числовой код ошибки от errno, а атрибут strerror представляет собой соответствующую строку, как было бы напечатано функцией C * 1012.*. См. Модуль 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)
1 голос
/ 24 января 2012

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

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

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

if [SPECIAL CASE]:
    [HANDLING CODE]
elif [special case]:
    [SPECIAL CASE]
[CODE]
0 голосов
/ 24 января 2012
try:
    # ...
except OSError:
    raise OSError("your answer")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...