laravel try / catch不适用于失败的查询

时间:2017-08-31 10:19:29

标签: php laravel laravel-5.4

我有一个INSERT查询,由于数据库中的某些唯一键可能会失败,所以我使用try / catch来避免错误... btw form_id是唯一的

    try {

        $reward = new UserCreditForm();
        $reward->user_id = $form->user_id ;
        $reward->form_id = $form->id ;
        $reward->amount = $amount ;
        $reward->result = $result ;
        $reward->save();
        $form->result = $result ;
        $form->save();

    }
    catch ( Exception $e )
    {
        $form->error_flag = 6 ;
        $form->save();
    }

但是当uniqu键失败并且我得到

时,try / catch不起作用
Whoops, looks like something went wrong.
(2/2) QueryException

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'user_credit_forms_form_id_unique' (SQL: insert into `user_credit_forms` (`user_id`, `form_id`, `amount`, `result`, `updated_at`, `created_at`) values (2, 1, 499392, 1, 2017-08-31 14:45:06, 2017-08-31 14:45:06))

无论如何都要避免错误并在查询失败时跳转到catche部分?

3 个答案:

答案 0 :(得分:4)

方式1:

您需要使用

\Illuminate\Database\QueryException $e

catch

} catch (\Illuminate\Database\QueryException $e) {

QueryException

的参考

方式2:

您也可以使用:

} catch (\Exception $e) {

答案 1 :(得分:4)

您应该使用catch ( \Exception $e )来捕获try中的所有例外情况。

最终表格应如下所示:

try {

    $reward = new UserCreditForm();
    $reward->user_id = $form->user_id ;
    $reward->form_id = $form->id ;
    $reward->amount = $amount ;
    $reward->result = $result ;
    $reward->save();
    $form->result = $result ;
    $form->save();

}
catch ( \Exception $e )
{
    $form->error_flag = 6 ;
    $form->save();
}

答案 2 :(得分:0)

当你编写Exception $e时,它会告诉PHP在当前命名空间中查找类Exception。由于您的代码很可能位于Laravel控制器内,因此当前命名空间最有可能是App\Http\Controllers。由于班级App\Http\Controllers\Exception不存在,所以你什么也得不到。您需要编写\Exception $e来告诉PHP在全局命名空间中查找Exception类。