是一种“守卫”方法抛出异常良好做法吗?

时间:2018-02-14 23:46:50

标签: design-patterns exception-handling guard-clause

以下代码会被视为“好”做法吗?

它是包的RPC端点的控制器。 我们的想法是轻松覆盖/扩展包含该软件包的特定项目的验证或授权。

你能说这些保护条款或方法吗? 有一个方法只是为了检查某些东西并在出现问题时抛出异常,这是一个好主意吗?

代码看起来很干净,但我会就此得到一些建议:)

public function doSomethingWithCustomer() {
    try {
        $this->validate();
        $this->authorize();
        $customer = $this->resolveCustomer();
        $customer->doSomething();
    } catch (HttpException $e) {
        $this->logger->error($e->getMessage());
        return $this->errorResponse($e->getStatusCode(), $e->getMessage());
    }
}

protected function validate()
{
    // Validate input

    if (!$valid) {
        throw new BadRequestHttpException('Invalid email address');
    }
}

protected function authorize()
{
    // Do some authorization checking

    if ($notAuthorized) {
        throw new AccessDeniedHttpException('Not authorized');
    }
}

protected function resolveCustomer()
{
    $customer = Customer::load(1);

    if (is_null($customer) {
        throw new NotFoundHttpException('Customer not found');
    }

    return $customer;
}

1 个答案:

答案 0 :(得分:1)

不,由于以下原因,这是一种不好的做法:

  1. 你永远不应该抓住一个保护条款例外(它是快速失败方法的一部分)
  2. 方法不能只包含保护条款
  3. Guard子句不应验证业务逻辑
  4. Here是关于后卫条款的一篇文章。我希望它能帮助你更好地理解它们。