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

Можно ли создать встроенное исключение, но с другим сообщением в Python?

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

Документация гласит:

exception ValueError: Поднимается, когда встроенная операция или функция получает аргумент (...)

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

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

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

4b9b3361

Ответ 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 упрощает просмотр, что в реализации есть ошибка, а не то, что ключ просто не находится в вашем объекте