Можно ли создать встроенное исключение, но с другим сообщением в Python?
Можно ли поднять встроенное исключение с помощью настраиваемого текста? или поднять встроенное предупреждение также с пользовательским текстом?
Документация гласит:
exception ValueError: Поднимается, когда встроенная операция или функция получает аргумент (...)
Предполагается ли, что только встроенные операции должны вызвать исключение ValueError?
На практике я понимаю, что безопасно создавать класс исключений, который наследует от ValueError или Exception. Но нормально ли это делать и напрямую поднять ValueError ( "пользовательский текст" )?
Поскольку ValueError встроен, повышение ValueError (с помощью специального текста) позволяет пользователям быстро увидеть, какая проблема связана с по сравнению с настраиваемым типом исключения (что-то вроде "ValueErrorSpecificModule", что не является стандартным).
Ответы
Ответ 1
Нет ничего оперативно не в том, чтобы делать что-то вроде:
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)
Вы можете сказать, что тип исключения указывает, что пошло не так, тогда как сообщение/атрибуты определяют, как оно пошло не так.
Ответ 2
Все в порядке, и я делаю это все время. Мне кажется неудивительно видеть 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
Ответ 3
Это нормально.
Однако вы можете создать свой собственный подкласс, чтобы отличить от встроенных исключений
Например, если у вас есть что-то, что работает как dict
, вы можете поднять KeyError по обычным причинам, но что, если KeyError действительно исходит из базового dict, который вы используете в реализации.
Поднятие подкласса KeyError упрощает просмотр, что в реализации есть ошибка, а не то, что ключ просто не находится в вашем объекте