Нужно сделать отдельное исключение NotEnoughBonusesException и бросать его, остальные логировать.
try {
}
catch (App\Exception\NotEnoughBonusesException $e) {
$transaction->rollBack();
Yii::$app->session->setFlash('error', 'Недостаточно бонусов для оплаты.');
}
catch (\Throwable $e) {
Yii::$app->session->setFlash('error', 'Произошла ошибка.');
$transaction->rollBack();
// Нужно бросить исключение дальше, чтобы обработчик по уполчанию его занес в лог
// Надеюсь в Yii есть обработчик по умполчанию?
throw $e;
}
Также вам следует создать базовый класс для всех исключений вашего приложения, а не использовать \Exception.
Если вы хотите передать сообщение для пользователя вместе с исключением, создайте интерфейс UserFriendlyExceptionInterface с методами setUserMessage/getUserMessage и используйте их для отправки сообщения об ошибке пользователю:
try {
} catch (App\Exception\UserFriendlyExceptionInterface $e) {
Yii::$app->session->setFlash('error', $e->getUserMessage());
throw $e; // Передаем дальше для логирования
}