不同类型的异常返回状态代码

Exceptions of different types return status codes

提问人:nick 提问时间:8/24/2023 更新时间:8/24/2023 访问量:38

问:

我在捕获异常时遇到问题,我所需要的只是转换此异常给出的错误代码并将其转换为状态代码,但我似乎无法理解其背后的逻辑或正确的方法。

我做了一个数组error_codes,其中我有一个键,它是错误代码和状态代码作为值。

CustomException 类:

class CustomException extends Exception {

    private static $ERROR_CODES;
    
    public function __construct($message,$code = 0, Throwable $previous = null) {
        if (!isset(self::$ERROR_CODES)) self::$ERROR_CODES = (require __DIR__.'/../../config/error_codes.php')();
        parent::__construct($message, $code, $previous);
    }
    
    public function getStatusCode() {
        $status_code = (array_key_exists($this->getCode(),self::$ERROR_CODES)) ? self::$ERROR_CODES[$this->getCode()] : self::$ERROR_CODES['default'];
        return $status_code;
    }


}

代码范围(其中您只需要检查捕获部分) 在此代码中: JWT 可以抛出异常,用户模型也可以抛出与数据库相关的异常

 try {
            //tocheck if isset, because if username is not available it will throw an error;
            $auth_header = $request->getHeaderLine('Authorization');
            $USER_DATA = json_decode($request->getBody()->getContents(), true);

            if (!empty($auth_header)) throw new CustomException('User already Logged in',40013);
            if (!is_string($USER_DATA['username']) || empty(trim($USER_DATA['username'])) ||
                !is_string($USER_DATA['password_hash']) || empty(trim($USER_DATA['password_hash'])))
                throw(new CustomException('', 40001));

            $user = User::login_user($USER_DATA);

            /******* JWT ******/
            $jwt_secret_key = $this->settings['jwt']['secret_key'];
            $jwt_algorithm = $this->settings['jwt']['algorithm'];
            $payload = array(
                'sub' => $user->id,
                'first_name' => $user->first_name,
                'last_name' => $user->last_name,
                'username' => $user->username,
                'exp' => time() + 3600
            );    
            $token = JWT::encode($payload, $jwt_secret_key, $jwt_algorithm);
            $response->getBody()->write($token);
            $response = $response->withHeader('Authorization', 'Bearer ' . $token);
            $response = $response->withStatus(200);
            // $response->getBody()->write(json_encode($decoded));
        } catch (Exception $e) {
            if ($e instanceof PDOException) return $response = $response->withStatus($this->getStatusCode($e->getCode()));
            $e = ($e instanceof CustomException) ? $e : new CustomException($e->getMessage(),$e->getCode());
            $response = $this->print_error($e,$response);
            $response = $response->withStatus( $e->getStatusCode());
        }

        return $response;

好的,所以问题是,我认为这不是一个好的做法,但我可以继续创建新的 CustomExceptions,但是如果抛出的异常是 PDOException 或 SQLException 类型,其中代码“42S22”是一个字符串,我在使用 ->getCode() 时收到错误,我不明白当我阅读文档时 getCode() 如何返回一个 int,但在这种情况下它是一个字符串, 并导致错误。 如果有人能向我解释一种处理所有错误并仅返回与它们相关的状态代码的好方法,我将不胜感激

提前致谢。

PHP 异常

评论

0赞 Lajos Arpad 8/24/2023
你得到什么错误?
0赞 nick 8/24/2023
我收到一个错误,表明我正在尝试用字符串类型的错误代码构造异常,在这行代码 ''' parent::__construct($message, $code, $previous);例如,PDOException 提供的$code是 '42S22',它是一个字符串
0赞 Lajos Arpad 8/24/2023
您可以毫不费力地将代码转换为 int。看我的答案。
0赞 Sammitch 8/24/2023
CustomError 类似乎只不过是静态映射和函数,它可以很容易地将异常的错误代码作为参数并变成静态的。getStatusCode()

答:

0赞 Lajos Arpad 8/24/2023 #1

您可以通过以下方式将代码转换为 int:

parent::__construct($message, intval($code), $previous);

您收到错误的原因是父类的构造函数(请参阅此处)显式声明为接收 int 代码。

编辑

如果 String 无法正确转换为 int,例如 42S22,则需要接受此类输入的 intval 结果为 0,或者将其转换为更适合你的另一个数值。