我有一个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部分?
答案 0 :(得分:4)
方式1:
您需要使用
\Illuminate\Database\QueryException $e
在catch
} catch (\Illuminate\Database\QueryException $e) {
的参考
方式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
类。