В моем приложении laravel, скажем, у меня есть немного кода, например, в качестве примера
function convert_amount($amount, $currency, $date)
{
if (strlen($currency) <> 3)
{
// Exception thrown
} else {
// convert $amount from $currency on $date
}
return $amount;
}
Здесь я просто конвертирую число из валюты в базу. Я выполняю простую проверку, чтобы убедиться, что переданная строка валюты состоит из 3 символов, чтобы убедиться, что это код валюты ISO (EUR, GBP, USD и т. Д.). Если нет, я хочу выдать исключение, но не привести к падению приложения на страницу с ошибкой, как это часто бывает в обработчике ошибок Laravel.
Вместо этого я хотел бы продолжить обработку страницы, но зарегистрировать исключение и, возможно, отобразить ошибку во флэш-сообщении.
Есть ли слушатель, которого я могу определить для Laravel, который достигает этого? Нужно ли определять новый тип исключения NonFatelException
возможно, это делает логику.
редактировать
По сути, я думаю, я мог бы зарегистрировать новый обработчик исключений следующим образом:
class NonFatalException extends Exception {}
App::error(function(NonFatalException $e)
{
// Log the exception
Log::error($e);
// Push it into a debug warning in the session that can be displayed in the view
Session::push('debug_warnings', $e->getMessage());
});
Тогда где-то в моем приложении:
throw new NonFatalException('Currency is the wrong format. The amount was not converted');
Проблема в том, что тогда будут вызываться обработчики исключений по умолчанию, что приведет к появлению страницы с ошибкой, а не к странице, которая должна была быть достигнута.
Я мог бы вернуть значение в свой обработчик, чтобы избежать значения по умолчанию, но я верю, что это приведет к тому, что будет показано только это возвращаемое значение, а остальные мои сценарии не будут запущены.
Вы на правильном пути. Почему бы не использовать try...catch
Тхо?
Ваш вспомогательный метод будет:
function convert_amount($amount, $currency, $date)
{
if (strlen($currency) <> 3)
{
throw new NonFatalException('Currency is the wrong format. The amount was not converted');
} else {
// convert $amount from $currency on $date
}
return $amount;
}
И всякий раз, когда вы будете использовать его, поместите его в try...catch
:
try {
convert_amount($amount, $currency, $date);
} catch (NonFatalException $e) {
// Log the exception
Log::error($e);
// Push it into a debug warning in the session that can be displayed in the view
Session::push('debug_warnings', $e->getMessage());
}
Таким образом, ваше приложение никогда не остановится, и у вас появится сообщение об ошибке в сеансе.
Других решений пока нет …