Laravel在app / Exceptions / Handler.php中捕获PDOException

时间:2016-09-29 00:49:01

标签: laravel exception-handling

我已经注意到我经常写这样的东西

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);
}

1 个答案:

答案 0 :(得分:0)

很多问题..你试过吗?

是的,如果这是抓住它的最后一个实例,你可以。如果您需要在代码的更深层次上使用它,请在那里使用它。

我喜欢这种方法适用于所有用户面临的例外情况' - 不应该看到 - 不是我尝试并希望在代码中更深层次捕获的东西。

在这里,您可以将这些例外情况组织起来,看看您不会在一个地方向用户投掷什么。

对于最后一个问题,可能是......,如果你找到一种方法来检查抛出异常的位置......比如debug_backtrace()[1] [' function']但这可能不起作用这里......并在if语句中使用它。

但是你可能不想要这样,因为如果在你的代码中的任何级别抛出某个异常,我都不会认为你想要以不同的方式处理它,这取决于它是在控制器中还是不。相反,你想要显示某些异常而不是其他异常,你真的想要那个,然后我会在控制器中捕获异常并返回你想要返回的内容。

添加: 你可能不想仅仅想要抑制输出,但也可能想要记录。如果是这样,那么将它放在Handler文件中的$ dontReport数组中,并在报告方法中创建一个这样的行: if (in_array(get_class($e), $this->dontReport)) return parent::report($e);