Есть многослойная архитектура. Нужно передать исключение с нижнего уровня (БД), на верхний (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']);
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей