【发布时间】:2020-06-06 22:50:38
【问题描述】:
我有一个后端项目,其中存在自己的“父级到所有异常”,类似这样(我也有从这个异常派生的 InvalidArgumentException):
class CaliException extends \Exception {
private $caliCode;
public function __construct(string $message = "", string $caliCode = self::UNDEFINED_CODE,
int $code = 0, Throwable $previous = null) {
parent::__construct($message, $code, $previous);
$this->caliCode = $caliCode;
}
function getCaliCode(): string {
return $this->caliCode;
}
}
从上面的代码中可以清楚地看出,自定义类的目的是能够保留字符串代码。为什么我需要字符串代码?因为我有 HTTP API,它的工作方式如下:
- 获取 JSON 请求
- 做点什么
- 使用“状态”字段生成 JSON 输出,该字段包含抛出异常的代码或“200”响应。这些状态码对于客户来说非常有用,他们可以区分不同的问题并做出相应的反应。
所以有问题。上面的系统产生这样的代码:
class UsernameFormatException extends InvalidArgumentException {
public const USERNAME_FORMAT_UNDEFINED_CODE = "DM:USERCA:0001";
public function __construct(string $message = "", string $calistoCode = self::USERNAME_FORMAT_UNDEFINED_CODE,
int $code = 0, \Throwable $previous = null) {
parent::__construct($message, $calistoCode, $code, $previous);
}
}
class PasswordFormatException extends InvalidArgumentException {
public const PASSWORD_FORMAT_UNDEFINED_CODE = "DM:USERCA:0002";
public function __construct(string $message = "", string $calistoCode = self::PASSWORD_FORMAT_UNDEFINED_CODE,
int $code = 0, \Throwable $previous = null) {
parent::__construct($message, $calistoCode, $code, $previous);
}
}
class InvalidLastActivityTimestampException extends InvalidArgumentException {
public const INVALID_TIMESTAMP = "DM:USERCA:0003";
public function __construct(string $message = "", string $calistoCode = self::INVALID_TIMESTAMP,
int $code = 0, \Throwable $previous = null) {
parent::__construct($message, $calistoCode, $code, $previous);
}
}
class InvalidCreationTimestampException extends InvalidArgumentException {
public const INVALID_TIMESTAMP = "DM:USERCA:0004";
public function __construct(string $message = "", string $calistoCode = self::INVALID_TIMESTAMP,
int $code = 0, \Throwable $previous = null) {
parent::__construct($message, $calistoCode, $code, $previous);
}
}
如所见,对于每个无效参数情况,我都会创建新的CaliException-派生异常。我认为它不酷。好吗?如何改进代码?
奖励问题:我读到当这是程序员的错误时我应该抛出\InvalidArgumentException,所以不能捕获异常。但在我的代码中没有\InvalidArgumentException 只有我自己的版本。在最佳实践等方面是否可以接受?以及如何区分是程序员的错误和用户的错误(无效的用户输入)? (毕竟,任何传递给函数的无效值都是相对于该函数无效的输入)
【问题讨论】:
-
如果代码有效,而您只是要求我们对其进行审核,请尝试将其发布到 Code Review。
-
"如何区分是程序员的错误和用户的错误" - 如果程序员将用户数据传递给需要特定类型的方法而没有先验证它,恕我直言,这仍然是程序员的错。如果用户传递了无效数据,您应该返回 400 Bad Request(如果是 API)
标签: php exception architecture