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

Kin*_*rog 24 sql laravel-5

我要做的就是验证查询.

'SELECT * from table_that_does_not_exist'
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*wis 44

捕获任何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.
}
Run Code Online (Sandbox Code Playgroud)

如果有任何错误,程序将die(var_dump(...))满足其需要.

注意:对于命名空间,您需要先将\该类作为use语句包含在内.

也供参考:Laravel 5.1 API - 查询异常

  • 对于Laravel 5.5,此答案对我不起作用。请参考以下问题:/sf/ask/3491709441/ (2认同)

Ash*_*fny 8

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

if ($exception instanceof \PDOException) {
    # render a custom error
}
Run Code Online (Sandbox Code Playgroud)

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


Ogb*_*lis 7

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

try
{
//write your codes here
}
catch(Exception $e)
{
   dd($e->getMessage());
}
Run Code Online (Sandbox Code Playgroud)

不要忘记在控制器顶部包含Exception类,方法是说

Use Exception;
Run Code Online (Sandbox Code Playgroud)

  • 这正是我正在尝试做的事情,我没有在控制器文件的顶部使用Exception,但是在尝试使用它时没有出现错误。太感谢了! (3认同)

*_*лов 6

Laravel 8.x

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

注* 需注明\Throwable $eThrowable $e