LSP относится к типам. Так что занятия на большинстве языков ООП. Тогда есть три способа рассмотреть ваш вопрос:
1. Исключение рассматривается как тип
Типы исключений, такие как, например, std::exception
в C ++, которые можно преобразовать в более специализированные исключения. Для облегчения обработки ошибок следует применять код LSP.
Исключения, как правило, имеют плохое поведение и просто передают некоторую дополнительную информацию об условиях ошибки, так что это не слишком сложно в целом.
2. Исключения рассматриваются как невыполненное предварительное условие
Исключение должно соответствовать исключительным ситуациям, которые не ожидаются в обычных обстоятельствах. Поэтому повышение исключения означает, что ожидаемые нормальные условия отсутствуют.
Таким образом, условия для возникновения исключения в производном типе должны быть равными или более слабыми, чем в общем типе.
Давайте возьмем крайний случай. Предположим, что не предусмотрено никаких исключений в базовом классе для данной подпрограммы. Вы ожидаете или даже указываете nothrow
. Код, использующий эту подпрограмму, будет считать ее безопасной и не предвидит ловли исключений. Предположим, что вы затем выводите этот класс в класс, который генерирует исключение (т. Е. Предварительные условия более строгие, более ограничительные): код, написанный для базового класса, будет застигнут врасплох, если возникнет исключение, и общий код для базового класса может порвать со специализированным классом. Так что LSP будет сломан.
3. Исключения, рассматриваемые как особый результат / постусловие
Вы можете утверждать, что в некоторых случаях исключение является особым постусловием. Альтернатива возвращаемому значению.
Мне было бы довольно неудобно с этой интерпретацией (так как многие языковые дизайнеры не понимают, см. Обсуждение о nothrow). Но у меня нет дальнейших объективных аргументов, чтобы сделать это недействительным
Поскольку LSP касается контрактов, вы можете принять это проектное решение. В этом случае более специализированный класс может генерировать более специализированное исключение (поэтому в этом случае рассуждение будет относиться к типу исключения). Но должен ли производный класс действительно генерировать как минимум столько же исключений, чем исходный? Это звучит нелогично. Перейти к 2.