Это в порядке для повышения встроенного исключения с пользовательским текстом? или повысить встроенное предупреждение также с пользовательским текстом?
Чтения документации:
исключение ValueError: Повышенный, когда встроенная операция или функция получают аргумент (…)
Подразумевается, что только встроенные операции должны повысить исключение ValueError?
На практике я понимаю, что безопасно создать класс исключений, который наследовался ValueError или Исключению. Но это в порядке, чтобы не сделать это и непосредственно повысить ValueError ("пользовательский текст")?
Так как ValueError встроен, повышение ValueError (с пользовательским текстом) позволяет пользователям быстро видеть, какая проблема включена, по сравнению с пользовательским типом исключительной ситуации (что-то как "ValueErrorSpecificModule", который не является стандартным).
Нет ничего неправомерного, что делает что-то вроде:
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)
Вы можете сказать, что тип исключения указывает , что пошло не так, тогда как Сообщение / атрибуты указывают Как пошло не так.
It's perfectly ok.
Однако, вы можете создать свой собственный подкласс, чтобы помочь отличить от встроенных исключений
Например, если у вас есть что-то, что работает как dict
, вы можете поднять KeyError по обычным причинам, но что, если KeyError на самом деле исходит из базового диктата, который вы используете в реализации.
Поднятие подкласса KeyError облегчает понимание того, что в реализации есть ошибка, а не то, что ключа просто нет в вашем объекте
.Все в порядке, и я делаю это все время. Я нахожу менее удивительным видеть 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