【问题标题】:Laravel catch exception and add message to a messagebagLaravel 捕获异常并将消息添加到消息包
【发布时间】:2015-02-13 11:00:52
【问题描述】:

我有一个存储库,如果在数据库中找不到记录,它会引发异常。而不是重定向到另一个页面,我只想显示一个警告警报,因为记录对页面并不重要,而是一个“异常事件”。

最好用代码来演示一下:

// FxRateRepositoy

public function getRate(/** args **/)
{
  $rate = FxRate::where(.... //query to get the rate
  if (!rate)
    throw new NonExistentCurrencyException(//message);

  return $rate;
}

在我的 start/global.php 我有一个处理程序:

App::error(function(NonExistentCurrencyException $e)
{
    Session::flash('alert', $e->getMessage());
    return \\ ??
});

返回什么?我必须返回响应,否则异常继续未被捕获。我想继续到预期的页面,但在会话中闪现警报。是否可以不必在调用此方法的每个地方都使用try catch 块?

另外一个问题,假设这个异常可能在一个请求中被多次抛出,那么累积警报消息并显示它们的最佳方法是什么?我在想类似于验证messageBag 的东西。我可以只使用全局$errors 变量,还是应该为此创建一个新的、特定的消息包?

【问题讨论】:

  • 为此,您应该直接在控制器中捕获异常并继续。

标签: php exception laravel laravel-4


【解决方案1】:

问题是如果你没有从App::error返回任何东西,Laravel 将显示它的默认错误页面。另一方面,您无法返回响应,因为您不知道错误处理程序中应该是什么响应。

我建议你在控制器本身处理它。

您可以在那里捕获异常并闪烁消息或根本不抛出异常:

$rate = FxRate::where(.... //query to get the rate
if (!rate){
    Session::flash('alert', 'Whoops');
}

findOrFail()firstOrFail 方法也可能有用。如果查询没有结果,他们会抛出ModelNotFoundException

try {
    $rate = FxRate::where(....)->firstOrFail()
    // and so on
} catch (Illuminate\Database\Eloquent\ModelNotFoundException $e){
    Session::flash('alert', 'Whoops');
}

消息系统,看laracasts/flash package

【讨论】:

  • 是的,我认为在另一个类中捕获它并积累消息的想法不是最好的想法。我已经恢复为仅制作错误处理程序并重定向到错误页面。尽管可以处理这些异常并附加一个带有错误消息的消息包,但它会使代码变得混乱并且难以维护。感谢您的意见。
猜你喜欢
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多