SSM框架全局捕获异常

我们都知道,项目有两种异常,一种是ERROR,一种是Exception,ERROR导致项目直接崩盘,无法运行,且不能捕获,Exception可以捕获且不影响项目运行,今天要做的就是捕获Exception,当前项目开发使用SSM框架,我原本使用的方法是Controller控制层每一个类每一个方法都有一个try-catch捕获当前方法异常,虽然这种可用,但是会有几个问题:

  • 向前端如何返回异常?
    即如何保证发生异常时向前端返回的数据统一,因为是不同人员开发,很可能A人员直接将异常扔给前端,而B人员将异常处理之后返回前端一个标识
  • 如何记录异常信息?
    我们要考虑到系统中每一处代码都有发生异常的可能性(在这里先仅考虑Controller层),即使我们编写异常记录的工具类,难道我们在每处发生异常的地方都调用吗?(不谈资源浪费的情况下,如何确保每个开发人员记录格式相同?如何确保每处Exception都会被记录?)

基于以上两点,我基于SSM框架做了一个Exception的全局捕获(亲测有效)
在这里插入图片描述
在这里即使用GlobalExceptionHandler类捕获控制层的异常,代码如下:

package org.jit.sose.exception;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
 * 全局捕获异常
 */
@ControllerAdvice(basePackages = "org.jit.sose.controller")
public class GlobalExceptionHandler {

	@ExceptionHandler(RuntimeException.class)
	@ResponseBody
	public Map<String, Object> exception(Exception e) {
		Map<String, Object> map = new HashMap<>();
		System.out.println("全局捕获异常统计");
		e.printStackTrace();
		map.put("info", "error");
		return map;
	}
}

@ControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上,basePackages代表指定包下面的方法,可以使用不同的类处理不同的异常。
@ExceptionHandler(RuntimeException.class)用于全局处理控制器里的异常,在这里我们只处理运行时异常。
@ResponseBody标识返回JSON格式。
参数里面加上Exception之后就可以使用e.printStackTrace()在控制台打印出异常,在这里将打印出的异常存储进日志文件(后期补充)方便查看,这样我们就不需要在每个控制层方法里面写多余的代码了。
在使用这个全局方法之前,我的控制层代码如下:

// 删除
@RequestMapping(value = "/delete.sose", method = RequestMethod.POST, consumes = "application/json;charset=UTF-8")
public Map<String, Object> delete(@RequestBody String c) throws ParseException {
	java.util.Map<String, Object> map = new HashMap<>();
	try {
		// 获取前端传回删除数据Id
		JSONObject strj = new JSONObject(c);
		evolveService.delete(strj.getInt("id"));
		map.put("info", "success");
	} catch (Exception e) {
		e.printStackTrace();
		map.put("info", e);
	}
	return map;
}

只是一个简单的删除操作,只是传一个标识到后端但是为了捕获异常并打印出来多写了五行代码,整个项目就多写了近2000行费代码,自己看着都烦心。
使用全局捕获之后能够确保每处异常都能捕获且打印,方便记录,减少代码量,异常的返回值统一(前端轻松)

猜你喜欢

转载自blog.csdn.net/single_cong/article/details/83717392
今日推荐