Как выполнить такие трюки с try/catch?

Есть блок 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.
  • Вопрос задан
  • 361 просмотр
Решения вопроса 1
ruFelix
@ruFelix
Предсказание будущего по руке, таро, кофе.
Вам надо их вложить.

try{
    try {
      // Doing all the work
    } catch (PDOException $e) {
        if ($e->getCode() === '23000') {
            $this->response->addError('this title already exists');
        } else {
            throw $e;
        }
    }
}catch (Exception $e) {
    $this->response->addError('the critical error has occurred, unable to save entry');
    $this->logger->writeThrowable($th);
    $this->response->post = $this->request->getPost();
    $this->showAdd();
    return;
}


Для более сложных конструкций вместо throw $e; бросаем throw new MyException('msg',123,$e); и когда он будет пойман у него через метод Exception::getPrevious можно забирать подарившее его исключение

p.s. Throwable вроде только в 7-ке, а она сыровата ещё.

Cуть finally
try {
	try {
		throw new Exception('hello world');
	} catch (Exception $e) {
		throw $e;
	} finally {
		echo " i work ";
	}

	echo ' not work ';
}catch(Exception $e){

}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы