【问题标题】:How to handle Server side Exception in Laravel如何在 Laravel 中处理服务器端异常
【发布时间】:2020-03-07 17:43:46
【问题描述】:

如何处理 Laravel 上的服务器端异常? 我正在创建一个更新 API,并且我传递了一个错误的值来处理异常,但我无法使用 try-catch 块捕获该错误。有人能帮我吗? 下面是代码:

{
"user_id" : "15835943395e63bb63c449d",
"changes" :{
    "username" : "new username",
    "name" : "new name",
    "statuss" : "inactive"
}
}

如您所见,我正在尝试传递一个无效字段,即 status 实际是 status

这是我处理这个问题的代码:

try{
            $json = json_decode($changes,true);
            $update = 'SET ';
            $columns = [];
            $values = [];
            $pdo = DB::connection()->getPdo();
            foreach ($json as $key => $value) {
                $columns[]=$key;
                $values[]=$value;
                $update .= $key . '=?,';
            }
            $update = substr($update, 0, -1);
            $sql = "update users ".$update." where user_id='".$request->input('user_id')."'";
            $sth = $pdo->prepare($sql, array(\PDO::ATTR_CURSOR => \PDO::CURSOR_FWDONLY));
            $sth->execute($values);
        }
        catch (Exception $e) {
            echo $e;
        }

但我没有得到邮递员的任何信息。

这是快照:

提前致谢。

【问题讨论】:

    标签: php laravel api pdo


    【解决方案1】:

    捕获任何sql 语法或查询错误的最简单方法是在关闭查询后捕获Illuminate\Database\QueryException

    try { 
       $json = json_decode($changes,true);
            $update = 'SET ';
            $columns = [];
            $values = [];
            $pdo = DB::connection()->getPdo();
            foreach ($json as $key => $value) {
                $columns[]=$key;
                $values[]=$value;
                $update .= $key . '=?,';
            }
            $update = substr($update, 0, -1);
            $sql = "update users ".$update." where user_id='".$request->input('user_id')."'";
            $sth = $pdo->prepare($sql, array(\PDO::ATTR_CURSOR => \PDO::CURSOR_FWDONLY));
            $sth->execute($values);
    } catch(\Illuminate\Database\QueryException $ex){ 
      dd($ex->getMessage()); 
      // Note any method of class PDOException can be called on $ex.
    }
    

    如果有任何错误,程序将die(var_dump(...)) 任何它需要的东西。

    注意:对于命名空间,如果类不包含在 use 语句中,则需要先 \

    也供参考:Laravel 6.x API - Query Exception

    【讨论】:

    • 谢谢@Ronak。我会检查这个
    【解决方案2】:

    虽然我是@Ronak 对 SQL 端的回答的粉丝,但如果您想在执行任何 SQL 之前捕获错误,您可以使用内置的 validate 方法在执行代码之前检查 API 参数。这样做的好处是您不仅可以要求存在哪些参数,还可以要求值应该是什么 - 检查here 以获取更多信息。

    在你的控制器中:

    public function validateRequest(Request $request) 
    {
        $rules = ['status' => ['required', Rule::in(['inactive', 'active'])]];
        $messages = ['status' => 'Status is a required parameter and must be either inactive or active'];
        $this->validate($request, $rules, $messages);
    }
    

    然后在你的 try 块中简单地

    try {
         $this->validateRequest($request)
         // ... rest of code goes here
    } catch (Exception $e) {
         return response()->json($e->getMessage(), 200); // response()->json() is a facade to return a JSON response 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多