Есть блок try, в нём ожидается выброс PDOException или другого Throwable. После него два блока catch.
Мне нужно:
1. Словить PDOException. Если там определённый код ошибки - вывести соотв. сообщение юзеру, иначе бросить исключение в следующий блок catch.
2. Словить PDOException из предыдущего блока catch и любые другие Throwable из блока try
- записать их в лог.
3. Подгрузить сохраненные данные и вывести их юзеру - только(!) в случае ошибок в блоке try.
Написал:
try {
// Doing all the work
} catch (\PDOException $e) {
if ($e->getCode() === '23000') {
$this->response->addError('this title already exists');
} else {
throw $e;
}
} catch (\Throwable $th) {
$this->response->addError('the critical error has occurred, unable to save entry');
$this->logger->writeThrowable($th);
} finally {
$this->response->post = $this->request->getPost();
$this->showAdd();
return;
}
Но в итоге получается совсем не то:
1. Ошибка из первого блока catch не отлавливается в следующем.
2. finally выполняется всегда, даже если исключений не было.
Как реализовать то, что нужно мне? Чтобы прежде всего не копипастить в каждом catch то, что я поместил в finally. Ну и пробрасывать ошибку в следующий catch.