Каждый слой должен обернуть исключение в чуть более абстрактное исключение.
Например, возьмем простую операцию входа клиента:
- DAL генерирует исключение "RecordNotFound" при попытке загрузить запись "клиента".
- BLL перехватывает его и помещает в исключение InvalidLogonRequest, говоря, что запись клиента не найдена.
- Графический интерфейс перехватывает это и отображает сообщение об ошибке для пользователя, говоря, что «клиент» не существует.
Каждый уровень под пользовательским интерфейсом не обязательно знает более широкий контекст выполняемой операции, поэтому уровень выше предоставляет дополнительную контекстную информацию о том, что пошло не так ...
Возможно, лучшим примером будет операция регистрации клиента:
- DAL генерирует sql «UniqueConstraintException» в столбце адреса электронной почты.
- Возможно, DAL не знает, что это процесс регистрации, он только знает, что делает ВСТАВКУ в таблицу клиентов ...
- BLL ловит это и генерирует исключение «EmailAlreadyExists».
- GUI ловит это и выводит пользователю сообщение «адрес электронной почты уже занят»