Spring MVC自定义异常

本文介绍了在Web管理系统中使用Spring MVC自定义异常的原因,旨在提供友好的用户提示。通过创建自定义异常类并实现HandlerExceptionResolver接口,可以统一处理异常信息。异常处理器将根据同步或异步请求以不同方式返回错误信息。
摘要由CSDN通过智能技术生成

在一些Web管理系统项目中,自定义异常最为常见,为什么要自定义异常呢?主要还是为了统一所有异常,例如:如何用户在用该系统时,突然发生异常或者错误,用户是看不明白的,所以要友好地提示用户。要解决这个问题可以用Spring MVC框架提供的接口来实现自定义异常。

  1. 首先,创建一个自定义异常类,该类继承异常类
public class CustomException extends Exception {

	private static final long serialVersionUID = -940735128639411704L;
	// 异常信息
	private String message;

	public CustomException(String message) {
		super(message);
		this.message = message;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	@Override
	public String toString() {
		return "CustomException [message=" + message + "]";
	}
	
}

  1. 在要捕获方法中抛出自定义异常CustomException给异常处理器处理
@LogAnnotation(operateType="修改角色")
	@Override
	public ResultInfo updateRoleList(URole uRole) throws CustomException {
		try {
			 userRoleMapper.updateRoleList(uRole);
		} catch (Exception e) {
			throw new CustomException("修改失败");
		}
	return ResultInfo.setResultInfo(true, "修改成功");
	}
  1. 在SpringMVC提供了HandlerExceptionResolver异常处理器接口,该处理器就处理一个业务逻辑:如果捕捉到自定义异常,那么就把自定义异常的错误信息取出。如果捕捉到运行时异常,那么就给出一个错误信息“未知错误"。如果是异步请求的话,就以JSON数据返回错误信息到页面上,否则为同步请求,把错误信息返回到错误页面上。
public class CustomExceptionResolver implements HandlerExceptionResolver {
	// 自定义异常处理器
	@Override
	public ModelAndView resolveException(HttpServletRequest request,
			HttpServletResponse response, Object object, Exception exception) {
		// 判断是否ajax请求
		if (!(request.getHeader("accept").indexOf("application/json") > -1 || (request
				.getHeader("X-Requested-With") != null && request.getHeader(
				"X-Requested-With").indexOf("XMLHttpRequest") > -1))) {
			// 对于非ajax请求,我们都统一跳转到error.jsp页面
			// 如果抛出的是系统自定义异常则直接转换
			CustomException customException = null;
			if (exception instanceof CustomException) {
				customException = (CustomException) exception;
			} else {
				// 如果抛出的不是系统自定义异常则重新构造一个未知错误异常。
				customException = new CustomException("未知错误,请与系统管理 员联系!");
			}
			ModelAndView modelAndView = new ModelAndView();
			modelAndView.addObject("message", customException.getMessage());
			modelAndView.setViewName("error");
			return modelAndView;
		} else {
			// 如果是ajax请求,JSON格式返回
			try {
				response.setContentType("application/json;charset=UTF-8");
				PrintWriter writer = response.getWriter();
				JSONObject json=new JSONObject();
			    json.put("success", false);
				// 为安全起见,只有业务异常我们对前端可见,否则统一归为系统异常
				if (exception instanceof CustomException) {
					json.put("msg", exception.getMessage());
				} else {
					//未知错误
					json.put("msg", "系统异常!");
				}
				writer.write(json.toString());
				writer.flush();
				writer.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}
}
  1. 最后,在spring-mvc.xml配置中声明异常处理器对象
<!-- 异常处理器 -->
<bean class="com.koi.exception.CustomExceptionResolver" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值