Нет ничего плохого в том, чтобы делать что-то вроде:
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)
Можно сказать, что тип исключения указывает , что пошло не так, в то время как сообщение / атрибуты указывают , как , оно пошло не так.