软件工程|为什么需要统一处理异常?以及如何处理?

为什么需要统一处理异常?以及如何处理?
回答这两个问题需要知道一些其他的问题答案:

为什么要处理异常?
程序在运行的时候,不能顾及到所有的情况,因此当输入了非法请求时,应当把考虑到的非设计范围内的情况合理的引导到异常中,不至于影响到程序的其他部分;
如何正确的处理异常?(软件工程)
后端开发人员可以简单的明白请求是非法的,并察觉到了是因为非法请求导致程序抛出了异常,这是由于开发者熟悉程序的细节,知道为什么程序会跑到这个异常的位置,但是对于运维和前端人员,他们看到了日志里记录专业化(开发化)的异常报错,有时是难以理解的,这对于团队代码开发是不利的。如果只是随便抛出一个RuntimeException,前端用户啥也看懂到,这对于软件的使用是不利的。
异常的描述要通俗,要让普通用户也能明白——为什么我的输入跑不通?密码错误了,购物车中商品失效了,而不是专业化的术语。要做到这点,就需要后端将后端发生的情况通俗化的传递给前端。

为什么要统一处理异常?
从实现角度来看,异常可以不用统一去处理,就好像对象也可以不用交予框架容器去管理一样,而不这么做的本质的目的都是为了软件的高效开发与维护。开发是一个持续的过程,在这个过程中总能碰到相似的、同类的异常,如果为了每种异常都去写一个自定义异常,为每种异常去写专门的前端响应,那将会增加开发的复杂程度,而且事倍功半,不利于后期维护。将异常统一起来管理,这是会方便开发的。
如何统一处理异常?
本项目是使用了spring框架带的异常处理框架,使用起来很简单,就是把@ExceptionHandler放到处理目标异常的方法上面就可以了。后面要标注(value = XXXXException.class),这样框架才能知道开发者要处理哪个异常。

这个应该涉及的东西很多,但是该项目只是用了一点,不妨,先把这一点写出来,wiki项目中的例子:


//统一异常处理、数据预处理等
//异常处理框架
@ControllerAdvice
public class ControllerExceptionHandler {
    private static final Logger LOG = LoggerFactory.getLogger(ControllerExceptionHandler.class);
	
    //校验异常统一处理
    @ExceptionHandler(value = BindException.class)//所有的BindException异常(自定义的异常)都会进入到这个方法来
    @ResponseBody
    public CommonResp validExceptionHandler(BindException e) {
        CommonResp commonResp = new CommonResp();
        LOG.warn("参数校验失败:{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        commonResp.setSuccess(false);
        commonResp.setMessage(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        return commonResp;
    }
}

你可能感兴趣的:(软件工程,项目,java,开发语言)