河曲智叟 发表于 2023-9-18 20:55:22

java中的自定义异常处理机制

在日常开发中我们难免会遇到各种各样的异常问题的发生,但是任何异常如果都在异常可能会出现的地方直接去处理会让业务逻辑显得很臃肿,代码看上去很冗余。在开发Web应用程序时,异常处理是一项非常重要的任务。异常处理可以提高程序的健壮性和稳定性。Java后端开发人员可以设计一个统一的全局异常处理方案来解决异常处理的问题,避免代码冗余,提高开发效率。在本文中,我们将介绍如何设计Java后端的全局异常处理方案。
什么是全局异常处理?

全局异常处理是一种将异常处理代码从业务逻辑中分离出来的技术。
在这里分两种全局异常处理的方式:

一、在Java中,全局异常处理使用@ControllerAdvice注解定义一个全局的异常处理类。在该类中,使用@ExceptionHandler注解捕获异常并进行处理。使用全局异常处理技术,可以统一处理异常,提高代码的复用性,降低代码的冗余度。
如下:
    // 全局异常处理类
@Slf4j<br>@RestControllerAdvice // @ResponseBody+@ControllerAdvice注解的结合体,@ControllerAdvice注解表示该类是全局异常处理类<br>public class ExceptionDeal {<br><br>    // 根据括号内的异常种类,全局如有相应的异常,则会被此注解捕获,进行方法内的下一步操作<br>    @ExceptionHandler(ArithmeticException.class)<br>    public String exceptions(ArithmeticException e) {<br>      log.info("全局异常:{}",e.getMessage());<br>      return "算法异常";<br>    }<br><br>    // 任何空指针异常会被该方法捕获处理<br>    @ExceptionHandler(NullPointerException.class)<br>    public String exceptions1(NullPointerException e) {<br>      log.info("全局异常:{}",e.getMessage());<br>      return "空指针异常";<br>    }<br>}<br>// 测试类@RestController<br>@RequestMapping("/demo")<br>public class TestDemo {<br>    @RequestMapping("/test")<br>    public String getInfo(){<br>      int a = 1/0;<br>      return a+"";<br>    }<br><br>    @RequestMapping("/test1")<br>    public String getInfos(){<br>      String s=null;<br>      BigDecimal bigDecimal = new BigDecimal(s);<br>      return bigDecimal.toString();<br>    }<br>}<br><br>二、利用面向切面编程(AOP)可以更方便地实现Java后端的全局统一异常处理。我们可以通过AOP将异常处理代码从业务逻辑代码中分离出来,降低代码耦合度,提高代码的可维护性和可扩展性。@Component<br>@Aspect<br>@Slf4j<br>public class Aspects {<br><br>    // 切入点(此处TestDemo类下的所有方法被执行时,均会被切面捕获处理)<br>    @Pointcut("execution(* com.demo.controller.TestDemo.*(..))")<br>    public void pt() {<br>    }<br><br>    // 制作切面<br>    @Around("pt()")<br>    public Object handleException(ProceedingJoinPoint pjp) throws Throwable {<br>      Object result;<br>      try {<br>            result = pjp.proceed();<br>            log.info("信息是:{}", result);<br>      } catch (Exception e) {<br>            log.info("异常信息:{}", e.getMessage());<br>            return "切面捕获异常成功!";<br>      }<br>      return result;<br>    }<br>}// 测试类@RestController<br>@RequestMapping("/demo")<br>public class TestDemo {<br>    @RequestMapping("/test")<br>    public String getInfo(){<br>      int a = 1/0;<br>      return a+"";<br>    }<br><br>    @RequestMapping("/test1")<br>    public String getInfos(){<br>      String s=null;<br>      BigDecimal bigDecimal = new BigDecimal(s);<br>      return bigDecimal.toString();<br>    }<br>}<br><br><br>
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: java中的自定义异常处理机制