如何在 laravel 中捕获查询异常以查看它是不是失败?

Posted

技术标签:

【中文标题】如何在 laravel 中捕获查询异常以查看它是不是失败?【英文标题】: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 非常感谢!随意将其添加为答案,以便我奖励您一百万美元。 哈哈没问题,会的! 【参考方案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,这个答案对我不起作用。请参考这个问题:***.com/questions/49881563/… 在我的情况下,有时 mysql 服务器出现故障,但我们正在努力修复。同时,如何处理此连接错误显示 (SQLSTATE[HY000] [1045] Access denied for user) 并显示软错误消息? @Butterfly 这超出了这个问题的范围。尝试在 *** 中搜索该错误,或​​提出新问题。 参考链接坏了,这个有效:laravel.com/api/8.x/Illuminate/Database/QueryException.html 为 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;

【讨论】:

这正是我想要做的,我没有在我的控制器文件顶部使用异常,但在尝试使用它时没有出错。谢谢一百万! 欢迎亚历克斯,我很高兴能帮上忙。

以上是关于如何在 laravel 中捕获查询异常以查看它是不是失败?的主要内容,如果未能解决你的问题,请参考以下文章

Phpunit:在 laravel 中处理验证异常

在 ajax 中捕获 laravel 验证异常

当它被抛出和捕获时,不要在那个异常处停止调试器

elmah 是不是也处理捕获的异常

laravel - 背包 - addFilter 自定义查询

Laravel 中的异常处理