Java捕获静态方法抛出异常的最佳实践咨询
Java Spring Boot Controller受检异常处理最佳实践
报错原因说明
Java语法要求所有局部变量在被读取前必须完成初始化,你当前的写法中如果HelloWorld.Answer()抛出HelloException进入catch块,result变量全程没有被赋值,return读取变量时自然触发编译错误。
推荐方案:全局统一异常处理(Spring生态标准实践)
这种写法符合分层设计原则,避免每个接口重复编写try-catch逻辑,异常处理规则统一维护。
步骤1:Controller不单独处理异常,直接抛出即可
@RestController public class HelloController { @RequestMapping(value = "/hello", method = RequestMethod.POST) public HelloResult Hello(@RequestBody HelloRequest request) throws HelloException { return HelloWorld.Answer(request.getName()); } }
步骤2:新增全局异常处理器兜底处理自定义异常
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(HelloException.class) public HelloResult handleHelloException(HelloException e) { // 生产环境建议替换为日志框架输出,比如log.error("业务处理异常", e) e.printStackTrace(); HelloResult errorResult = new HelloResult(); // 可根据业务需求自定义错误码、错误提示 errorResult.setCode(500); errorResult.setMsg(e.getMessage()); return errorResult; } }
该方案优势:
- 接口层代码简洁无冗余
- 异常处理逻辑统一,后续调整规则无需逐个修改Controller
- 支持拓展适配多种异常类型的处理规则
备选方案:当前方法内完成异常全分支处理
如果不需要全局统一处理,也可以保证所有执行分支下返回值都有初始化,两种写法可选:
写法1:异常分支给返回变量赋值兜底值
@RestController public class HelloController { @RequestMapping(value = "/hello", method = RequestMethod.POST) public HelloResult Hello(@RequestBody HelloRequest request) { HelloResult result; try { result = HelloWorld.Answer(request.getName()); } catch (HelloException e) { e.printStackTrace(); result = new HelloResult(); result.setCode(500); result.setMsg("请求失败:" + e.getMessage()); } return result; } }
写法2:直接在try/catch块内分别返回,省去中间变量
@RestController public class HelloController { @RequestMapping(value = "/hello", method = RequestMethod.POST) public HelloResult Hello(@RequestBody HelloRequest request) { try { return HelloWorld.Answer(request.getName()); } catch (HelloException e) { e.printStackTrace(); HelloResult errorResult = new HelloResult(); errorResult.setCode(500); errorResult.setMsg("请求失败:" + e.getMessage()); return errorResult; } } }
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

