【问题标题】:How do I catch a query exception in laravel to see if it fails?如何在 laravel 中捕获查询异常以查看它是否失败?
【发布时间】:2016-02-14 06:46:27
【问题描述】:

我要做的只是验证查询。

'SELECT * from table_that_does_not_exist'

如果没有那个错误,我想知道它失败了,所以我可以返回一个响应,指出“错误:表不存在”或一般错误。

【问题讨论】:

  • 如果您使用Eloquent 进行查询,您可以在DB::raw() 查询上使用firstOrFail()。或try{ } catch (Illuminate\Database\QueryException $ex){ }
  • 我尝试了try catch,但它仍然显示错误。例如:尝试 { $results = DB::connection('myDB')->select('BAD TEXT QUERY SHOULD FAIL'); } catch ( Illuminate\Database\QueryException $e) { // 不要做任何事情 }
  • try { $results = \DB::connection("example")->select(\DB::raw("SELECT * FROM unknown_table"))->first(); } catch(\Illuminate\Database\QueryException $ex){ die("Caught an error"); } 抛出和dies“发现错误”。你在Illuminate之前有\吗?我刚刚意识到我在第一条评论中忘记了这一点。此外,您 $ex 将扩展基类 Exception,因此您可以调用 $ex->getMessage() 以返回确切的错误。
  • @TimLewis 非常感谢!随意将其添加为答案,以便我奖励您一百万美元。
  • 哈哈没问题,会的!

标签: sql laravel-5


【解决方案1】:

Laravel 8.x

    try {
        $model->save(); // Use Eloquent: https://laravel.com/docs/8.x/eloquent
    } catch (\Throwable $e) {
        return 'My error message';
    }

注意*需要指定\Throwable $e 没有Throwable $e。

【讨论】:

    【解决方案2】:

    捕获任何sql 语法或查询错误的最简单方法是在关闭查询后捕获Illuminate\Database\QueryException:

    try { 
      $results = \DB::connection("example")
        ->select(\DB::raw("SELECT * FROM unknown_table"))
        ->first(); 
        // Closures include ->first(), ->get(), ->pluck(), etc.
    } catch(\Illuminate\Database\QueryException $ex){ 
      dd($ex->getMessage()); 
      // Note any method of class PDOException can be called on $ex.
    }
    

    如果有任何错误,程序将die(var_dump(...)) 任何它需要的东西。

    注意:对于命名空间,如果类未包含在 use 语句中,则需要首先使用 \。

    也供参考:

    Laravel 5.5 API - Query Exception

    Laravel 8.x API - Query Exception

    【讨论】:

    • 对于 Laravel 5.5,这个答案对我不起作用。请参考这个问题:stackoverflow.com/questions/49881563/…
    • 在我的情况下,有时 mysql 服务器出现故障,但我们正在努力修复。同时,如何处理此连接错误显示 (SQLSTATE[HY000] [1045] Access denied for user) 并显示软错误消息?
    • @Butterfly 这超出了这个问题的范围。尝试在 Stackoverflow 中搜索该错误,或​​提出新问题。
    • 为 Lumen 8 工作,谢谢!我只使用了Exception,它没有捕捉到QueryException,现在当指定\Illuminate\Database\QueryException它捕捉它!
    【解决方案3】:

    如果你想捕获所有类型的数据库异常,你可以在 laravel Exception Handler 上捕获它

    if ($exception instanceof \PDOException) {
        # render a custom error
    }
    

    有关如何使用 laravel 的更多详细信息Exception Handler 请查看https://laravel.com/docs/7.x/errors

    【讨论】:

    • 请真的应该支持这个。迄今为止最好的答案,谢谢!
    • reference link 获取详细文档,在此先感谢
    • 感谢 Ashraf,这很有帮助。 app/Exceptions/Handler.php 中的示例: public function report(Throwable $exception) { if ($exception instanceof \PDOException) { dd("连接数据库出错,请打开MySQL数据库服务器"); } 父::报告($异常); }
    【解决方案4】:

    使用 try-catch 语句包装您希望捕获异常的代码行

    try
    {
    //write your codes here
    }
    catch(Exception $e)
    {
       dd($e->getMessage());
    }
    

    不要忘记在控制器顶部包含异常类

    Use Exception;
    

    【讨论】:

    • 这正是我想要做的,我没有在我的控制器文件顶部使用异常,但在尝试使用它时没有出错。谢谢一百万!
    • 欢迎亚历克斯,我很高兴能帮上忙。
    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 2017-01-20
    • 2020-07-22
    相关资源
    最近更新 更多