目录
一,通过实现HandlerExceptionResolver接口完成异常处理;(注意:此接口需导入包:spring-webmvc-5.0.8.RELEASE.jar)
二,通过注解完成全局异常处理;(推荐使用注解式)这里出了一点bug,没运行成功!但这种继承BaseController的方式也可实现全局异常处理,也推荐
一,通过实现HandlerExceptionResolver接口完成异常处理;(注意:此接口需导入包:spring-webmvc-5.0.8.RELEASE.jar)
1,异常处理器原理;
(异常处理器原理图)
其他代码同:https://blog.csdn.net/qq_40323256/article/details/92174265
不同处如下:
MyException.java:
package com.lijiang.exception;
public class MyException extends Exception {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public MyException(String msg) {
super();
this.msg = msg;
}
}
MyHandlerExceptionResolver.java:
package com.lijiang.exception;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(
HttpServletRequest request,
HttpServletResponse response,
Object obj,
Exception e) {
ModelAndView mav=new ModelAndView();
String errorMsg="";
if(e instanceof MyException){
// 执行自定义异常处理
errorMsg="自定义异常:"+((MyException)e).getMsg()+" "+obj;
}else{
// 运行时异常
errorMsg="运行时异常:"+e.getMessage()+" "+obj;
}
mav.addObject("error", errorMsg);
mav.setViewName("error");
return mav;
}
}
springmvc.xml:
<!-- 配置异常处理器 -->
<bean class="com.lijiang.exception.MyHandlerExceptionResolver"></bean>
error.jsp:
<body>
<h1>${error }</h1>
</body>
2,使用异常处理器捕获运行时异常;
@Override
public List<ItemInfo> selectAll(ItemInfo itemInfo) throws MyException {
// 运行时异常
int i=1/0;
// 自定义异常
// if(true){
// throw new MyException("列表没有获取到!!");
// }
return itemMapper.selectAll(itemInfo);
}
运行结果:
3,使用异常处理器捕获自定义异常;
@Override
public List<ItemInfo> selectAll(ItemInfo itemInfo) throws MyException {
// 运行时异常
// int i=1/0;
// 自定义异常
if(true){
throw new MyException("列表没有获取到!!");
}
return itemMapper.selectAll(itemInfo);
}
运行结果:
二,通过注解完成全局异常处理;(推荐使用注解式)这里出了一点bug,没运行成功!但这种继承BaseController的方式也可实现全局异常处理,也推荐
1,通过@ControllerAdvice注解使@ExceptionHandler异常处理注解应用到所有使用@RequestMapping的方法上;
2,处理运行时异常:直接打印错误信息;
3,处理自定义异常:将错误信息输出到error页面上;
MyGlobalExceptionHandler.java:
package com.lijiang.exception;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class MyGlobalExceptionHandler {
// 处理运行时异常
@ExceptionHandler(RuntimeException.class)
@ResponseBody
String runtimeHandler(RuntimeException e){
return e.getMessage();
}
// 处理自定义异常 MyException
@ExceptionHandler(MyException.class)
public String myException(MyException e,Model model){
model.addAttribute("error", e.getMsg()+" "+e.getStackTrace()[0]);
return "error";
}
}
其他不变,记得注释掉刚刚的springmvc.xml里配置的异常处理器:<bean class="com.lijiang.exception.MyHandlerExceptionResolver"></bean>