Для упрощения допустим ситуацию, когда мы выделили некий Service layer, а Domain layer из него не выделили и все - и работа с базой и другой инфраструктурой и бизнес-логикой - все в одном там пока лежит.
Нужно нам иногда кидать исключения. Давайте пока самый просто юзкейс - publish the post. Можно делать все по канонам:
abstract class BusinessException;
class CantPublishAlreadyPublishedPost extends BusinessException;
class CantPublishPostWithEmptyBody extends BusinessException;
и метод PublishPostAction:: publish throws CantPublishAlreadyPublishedPost, CantPublishPostWithEmptyBody и еще полно всего типа база упала.
Вопроса два.
1) Если следовать принципу Information hiding то почему конкретно нельзя опубликовать пост - дело касается только PublishPostAction. Никто другой ничего конкретного из этой информации не извлечет. тогда не проще ли вообще:
final class BusinessException;
и генерить только new BusinessException("Post already published");
Поскольку только юзеру интересно почему конкретно не смог произойти экшен. Приложение интересно только - кто виноват. если юзер - пофиг. если мы(база упала), то надо залогировать.
Да и я помню некие дискуссии тут, что вещи типа "Post already published" даже не заслуживают эксепшена. можно просто вернуть некий "результат выполнения экшена" где опишем успешно ли и если нет, то error message.
2) Есть еще советы по оборачиванию всего в этом экшене в большой try и оборачивании всех эксепшенов в специальный ServiceLayer эксепшены. Потому что если эксепшен идет в другой слой, то его надо обернуть.
Вот как пример: https://pastebin.com/X4gjh7Dz
и CreateTestAction::create throws only CantCreateTestException и ничего больше.
Какая практическая польза от этого?
С выделением домена и его эксепшенами ситуация вроде несильно поменяется...
Нужно нам иногда кидать исключения. Давайте пока самый просто юзкейс - publish the post. Можно делать все по канонам:
abstract class BusinessException;
class CantPublishAlreadyPublishedPost extends BusinessException;
class CantPublishPostWithEmptyBody extends BusinessException;
и метод PublishPostAction:: publish throws CantPublishAlreadyPublishedPost, CantPublishPostWithEmptyBody и еще полно всего типа база упала.
Вопроса два.
1) Если следовать принципу Information hiding то почему конкретно нельзя опубликовать пост - дело касается только PublishPostAction. Никто другой ничего конкретного из этой информации не извлечет. тогда не проще ли вообще:
final class BusinessException;
и генерить только new BusinessException("Post already published");
Поскольку только юзеру интересно почему конкретно не смог произойти экшен. Приложение интересно только - кто виноват. если юзер - пофиг. если мы(база упала), то надо залогировать.
Да и я помню некие дискуссии тут, что вещи типа "Post already published" даже не заслуживают эксепшена. можно просто вернуть некий "результат выполнения экшена" где опишем успешно ли и если нет, то error message.
2) Есть еще советы по оборачиванию всего в этом экшене в большой try и оборачивании всех эксепшенов в специальный ServiceLayer эксепшены. Потому что если эксепшен идет в другой слой, то его надо обернуть.
Вот как пример: https://pastebin.com/X4gjh7Dz
и CreateTestAction::create throws only CantCreateTestException и ничего больше.
Какая практическая польза от этого?
С выделением домена и его эксепшенами ситуация вроде несильно поменяется...