PHP异常处理switch-case圈复杂度超标如何重构?
重构方案
你当前代码圈复杂度超标的原因是switch分支数量达到6个(5个case+1个default),超过phpinsights要求的阈值5。我们可以通过异常处理映射表+查表逻辑的方式重构,消除多分支判断,将圈复杂度降到2,完全符合规范。
第一步:定义异常处理映射
在你的final类中新增私有常量,把所有异常类对应的处理规则集中管理,特殊逻辑用闭包封装:
private const EXCEPTION_HANDLER_MAP = [ \Symfony\Component\HttpKernel\Exception\NotFoundHttpException::class => 'page not found', \Illuminate\Database\Eloquent\ModelNotFoundException::class => 'entity not found', \TypeError::class => 'type error', // 自定义处理QueryException \Illuminate\Database\QueryException::class => function (\Illuminate\Database\QueryException $exception) { return Str::contains($exception->getMessage(), 'Duplicate') ? 'duplicate error' : 'query error'; }, // 自定义处理ServiceException \ServiceException::class => function (\ServiceException $exception) { return [ 'message' => $exception->getMessage(), 'errors' => $exception->getErrors() ]; } ];
第二步:替换原switch代码
把原来的整段switch逻辑替换为查表逻辑:
$exceptionClass = get_class($exception); // 未匹配到对应处理规则走默认逻辑 if (!isset(self::EXCEPTION_HANDLER_MAP[$exceptionClass])) { return self::fail($exception->getMessage()); } $handler = self::EXCEPTION_HANDLER_MAP[$exceptionClass]; // 处理闭包类型的自定义逻辑 if ($handler instanceof \Closure) { $handleResult = $handler($exception); // 适配ServiceException多参数返回 if (is_array($handleResult) && isset($handleResult['message'], $handleResult['errors'])) { return self::fail($handleResult['message'], $handleResult['errors']); } return self::fail($handleResult); } // 普通固定提示直接返回 return self::fail($handler);
重构优势
- 圈复杂度降至2,满足phpinsights的检测要求
- 后续新增异常处理规则只需在映射表中新增配置,无需修改核心处理逻辑,符合开闭原则
- 所有异常处理规则集中维护,可读性和可维护性更高
内容的提问来源于stack exchange,提问作者mohammad
相关产品推荐
相关产品推荐

