Правильно ли я использую исключения?

вот код
public function actionOrder($bonus, $id){

		$transaction = Yii::$app->db->beginTransaction();
		$order= Order::findOne($id);
	    try {
	        $paymentStatus = $this->getPaymentStatus($order, $bonus);
	        Yii::$app->db->createCommand()->update('"order"', ['payment_status' => $paymentStatus, 'points_bonus' => $paysum, 'bonus' => 
	        $transaction->commit();
	    } catch (\Exception $ex) {
	        $transaction->rollBack();
	        Yii::$app->session->setFlash('error', $ex->getMessage());
	    }
	}
    


    private function getPaymentStatus($order,$bonus){
        $result=Order::PAYMENT_STATUS_PARTED_PAYED ;
        if($bonus['bonus']-$order->sum<0){
            throw new \Exception('У вас не хватает бонусов для оплаты бонусами');
        }
        return $result;
    }


Собственно вопрос в чем правильно ли я кидаю исключение в приватном методе getPaymentStatus и выкинет ли меня в catch в публичном методе actionOrder в случае если сработает исключение в приватном методе. И если не правильно то как правильно ?
  • Вопрос задан
  • 150 просмотров
Пригласить эксперта
Ответы на вопрос 3
voronkovich
@voronkovich
Нужно сделать отдельное исключение 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; // Передаем дальше для логирования
}
Ответ написан
@karminski
Senior React.JS Developer
Как правило, исключения должны срабатывать в тех ситуациях, когда не возможно вернуть user friendly ответ пользователю. Все исключения должны писаться в логи, и не должны выводиться на экран (в production-режиме). Вы же как я понимаю, хотите вывести пользователю статусное сообщение. Так что нет - в вашем случае исключения не к месту.
Ответ написан
usdglander
@usdglander
Yipee-ki-yay
Да. Выкинет.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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