我已经注意到我经常写这样的东西
class SitesController
{
public function update(SiteRequest $request, Site $site)
{
try {
$site->update($request->all());
return redirect()->route('sites.index');
} catch (PDOException $e) {
return redirect()
->back()
->with('error', 'Cannot update site');
}
}
public function destroy(Site $site)
{
try {
$site->delete();
return redirect()->route('sites.index');
} catch (PDOException $e) {
return redirect()
->back()
->with('error', 'Cannot remove site');
}
}
}
我可以像这样在app/Exceptions/Handler.php
中捕获PDOException吗?好吗
理念?什么是利弊?有没有办法捕获抛出的PDOException
仅来自app / Http / Controllers文件夹?
// app/Exceptions/Handler.php
public function render($request, Exception $e)
{
if (!App::runningInConsole() && $e instanceof PDOException) {
return back()->with('error', 'Could not perform the operation');
}
return parent::render($request, $e);
}
答案 0 :(得分:0)
很多问题..你试过吗?
是的,如果这是抓住它的最后一个实例,你可以。如果您需要在代码的更深层次上使用它,请在那里使用它。
我喜欢这种方法适用于所有用户面临的例外情况' - 不应该看到 - 不是我尝试并希望在代码中更深层次捕获的东西。
在这里,您可以将这些例外情况组织起来,看看您不会在一个地方向用户投掷什么。
对于最后一个问题,可能是......,如果你找到一种方法来检查抛出异常的位置......比如debug_backtrace()[1] [' function']但这可能不起作用这里......并在if语句中使用它。
但是你可能不想要这样,因为如果在你的代码中的任何级别抛出某个异常,我都不会认为你想要以不同的方式处理它,这取决于它是在控制器中还是不。相反,你想要显示某些异常而不是其他异常,你真的想要那个,然后我会在控制器中捕获异常并返回你想要返回的内容。
添加:
你可能不想仅仅想要抑制输出,但也可能想要记录。如果是这样,那么将它放在Handler文件中的$ dontReport数组中,并在报告方法中创建一个这样的行:
if (in_array(get_class($e), $this->dontReport)) return parent::report($e);