如何在 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 中捕获查询异常以查看它是不是失败?的主要内容,如果未能解决你的问题,请参考以下文章