Это в порядке для повышения встроенного исключения, но с другим сообщением, в Python?

Это в порядке для повышения встроенного исключения с пользовательским текстом? или повысить встроенное предупреждение также с пользовательским текстом?

Чтения документации:

исключение ValueError: Повышенный, когда встроенная операция или функция получают аргумент (…)

Подразумевается, что только встроенные операции должны повысить исключение ValueError?

На практике я понимаю, что безопасно создать класс исключений, который наследовался ValueError или Исключению. Но это в порядке, чтобы не сделать это и непосредственно повысить ValueError ("пользовательский текст")?

Так как ValueError встроен, повышение ValueError (с пользовательским текстом) позволяет пользователям быстро видеть, какая проблема включена, по сравнению с пользовательским типом исключительной ситуации (что-то как "ValueErrorSpecificModule", который не является стандартным).

23
задан Eric O Lebigot 2 February 2010 в 09:09
поделиться

3 ответа

4378857-

Нет ничего неправомерного, что делает что-то вроде:

raise ValueError("invalid input encoding")

на самом деле я делаю это довольно часто, когда я пишу первый проход некоторых кода. Основная проблема с этим таким образом, что клиенты вашего кода трудно быть точным в их обработке исключения; Чтобы поймать это конкретное исключение, им придется делать сопоставление строк на объекте исключения, которые они поймали, что, очевидно, хрупкий и утомительный. Таким образом, было бы лучше ввести свой собственный подкласс ValueError; Это все еще может быть поймано в качестве ValueError, но и более конкретным классом исключения.

Общее правило - это то, что всякий раз, когда у вас есть код, как:

raise ValueError('some problem: %s' % value)

, вы, вероятно, должны заменить его чем-то вроде:

class SomeProblem(ValueError):
    """
    Raised to signal a problem with the specified value.
    """
# ...
raise SomeProblem(value)

Вы можете сказать, что тип исключения указывает , что пошло не так, тогда как Сообщение / атрибуты указывают Как пошло не так.

26
ответ дан 29 November 2019 в 02:30
поделиться

It's perfectly ok.

Однако, вы можете создать свой собственный подкласс, чтобы помочь отличить от встроенных исключений

Например, если у вас есть что-то, что работает как dict, вы можете поднять KeyError по обычным причинам, но что, если KeyError на самом деле исходит из базового диктата, который вы используете в реализации.

Поднятие подкласса KeyError облегчает понимание того, что в реализации есть ошибка, а не то, что ключа просто нет в вашем объекте

.
2
ответ дан 29 November 2019 в 02:30
поделиться

Все в порядке, и я делаю это все время. Я нахожу менее удивительным видеть TypeError, чем MySpecialTypeError во многих ситуациях.

На странице , на которую вы указали , я не вижу фразы «встроенный»:

exception TypeError: Raised when an operation or function is applied to an object of inappropriate type. The associated value is a string giving details about the type mismatch.

Возможно, кто-то видел ваш вопрос и уже исправил документацию.
РЕДАКТИРОВАТЬ: Похоже, вы вставили документацию для ValueError вместо TypeError

4
ответ дан 29 November 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: