Как правильно ставить и отлавливать исключения в многослойной архитектуре?

173
11 августа 2021, 04:00

Есть многослойная архитектура. Нужно передать исключение с нижнего уровня (БД), на верхний (UI). Между ними может быть еще несколько слоев абстракций. Нужно ли на каждом слое отлавливать исключения своего нижнего уровня, чтобы передать на свой верхний, или ловить на самом верхнем уровне сразу исключение самого нижнего?

Пример в в коде:

Controller{
    function deleteAction($id){
    $this->service->delete(id);
  } 
}
Service{
function delete($id){
    $data = $this->repository->getById($id);
    $this->repository->delete($id);
    $this->fileStorage->delete($data['image_path']);
  }
}
Repository{
  function delete($id){
    $result = $this->mysqli->delete($id);
    if(!$result){
      throw new NotDeletedRepositoryException('not deleted from db');
    }
  }
  function getById($id){
    return $this->mysqli->find($id);
  }
}
Storage{
  function delete($path){
    $result = $this->fileSystem->deleteFile($path);
    if(!$result){
      throw new NotDeletedStorageException('not deleted file');
    }
  }
}

Варианты отлова.

Вариант 1:

Controller{
    function deleteAction($id){
    try{
        $this->service->delete(id);
    }catch(NotDeletedServiceException $e){
            //обработка    
    }
  } 
}
Service{
function delete($id){
    $data = $this->repository->getId($id);
    if(!$data){
      throw new NotDeletedServiceException('Not found in db'); 
    }
    try{
        $this->repository->delete($id);
        $this->fileStorage->delete($data['image_path']);
    }catch(NotDeletedStorageException | NotDeletedRepositoryException $e){
      throw new NotDeletedServiceException($e->getMessage()); 
    }  
  }
}

Вариант 2:

Controller{
    function deleteAction($id){
    try{
        $this->service->delete(id);
    }catch(NotDeletedServiceException | NotDeletedStorageException | NotDeletedRepositoryException $e){
            //обработка    
    }
  } 
}
Service{
function delete($id){
    $data = $this->repository->getId($id);
    if(!$data){
      throw new NotDeletedServiceException('Not found in db'); 
    }
    $this->repository->delete($id);
    $this->fileStorage->delete($data['image_path']);
  }
}
READ ALSO
Не возвращается ответ из таблицы mysql

Не возвращается ответ из таблицы mysql

У меня есть такая таблица:

159
Как отправить через POST переменную без input

Как отправить через POST переменную без input

Есть форма, которая передаёт значения select-ов через POST-запрос, но надо к ним добавить ещё массив, который формируется в процессе создания этих...

317
Когда выполняется main?

Когда выполняется main?

Есть Class1, в котором создаётся экземпляр Class2:

165
Как кодировать audio файл в строку Base64?

Как кодировать audio файл в строку Base64?

Я загружаю файл audio через onActivityResult(), мне нужно его отправить на сервер (php) с помощью библиотеки volleyКак мне кодировать audio в строку base64

191