ValueError
больше похоже на эквивалент IllegalArgumentException
в Java.
RuntimeError звучит как лучше для меня:
Возникает при обнаружении ошибки, которая не попадает ни в одну из других категорий. Связанное значение представляет собой строку, указывающую, что именно пошло не так.
В большинстве случаев вы не хотите выполнять какую-либо специальную обработку ошибок для такой ошибки, поэтому универсальный RuntimeError
должен быть достаточным из коробки.
Если вы хотите обрабатывать это иначе, чем другие ошибки, просто извлеките из этого ваше собственное исключение:
class IllegalStateError(RuntimeError):
pass