异常
我们都学过异常处理,就是用
try&catch
,但是项目比较大,那很多地方需要加上大量的try&catch
,而且包含的异常类型会很多,特别费时和麻烦;这里我们可以通过aop来解决这个问题把业务逻辑和异常处理代码分开,实现解耦合;springmvc使用全局的,统一的异常处理,即把controller中的异常都集中到一个地方进行处理
异常处理步骤
-
新建maven web项目
-
加入依赖
-
新建一个自定义异常类
MyUserException
,再定义其子类NameException
,AgeException
MyUserException
public class MyUserException extends Exception { public MyUserException() { super(); } public MyUserException(String message) { super(message); } }
NameException
public class NameException extends MyUserException{ public NameException() { super(); } public NameException(String message) { super(message); } }
AgeException(略,同上)
-
在
controller
抛出NameException
,AgeException
@Controller public class Mycontroller { @RequestMapping(value = "/some.do") public ModelAndView doSome(String name,Integer age) throws MyUserException { ModelAndView mv=new ModelAndView(); //根据请求参数抛出异常 if( !"zs".equals(name)){ throw new NameException("姓名出错!!!"); } if(age == null || age > 80){ throw new AgeException("年龄太大啦!!!"); } mv.addObject("msg",name); mv.addObject("fun",age); mv.setViewName("show"); return mv; } }
-
创建一个普通类,作用全局异常处理类
- 在类的上面加入
@ControllerAdvice
- 在类中定义方法,在方法上加入
@ExceptionHandler
GlobalExceptionHandler
@ControllerAdvice public class GlobalExceptionHandler { /** * 定义方法,处理发生的异常 * 处理异常的方法和控制器方法的定义一样,可以有多个参数,可以有ModelAndView * String,void,对象类型的返回值 * @ExceptionHandler(异常的class):表示异常的类型,当发生此类型异常时,由当前方法处理 */ @ExceptionHandler(value= NameException.class) public ModelAndView doNameException(Exception e ){//形参表示Controller抛出的异常对象,通过这个来获取发生的异常 //处理NameException的异常 /** * 异常发生处理逻辑 * 1.把异常的发生时间,哪个方法发生的,异常错误内容记录到数据库,日志文件 * * 2.发送通知,把异常信息通过邮件,短信或微信发送给相关人员 * * 3.给用户友好提示 */ ModelAndView mv=new ModelAndView(); mv.addObject("msg","姓名必须为zs才可登陆"); mv.addObject("ex",e); mv.setViewName("nameError"); return mv; } @ExceptionHandler(value= AgeException.class) public ModelAndView doAgeException(Exception e ){ //处理AgeException的异常 ModelAndView mv=new ModelAndView(); mv.addObject("msg","所填写年龄过大"); mv.addObject("ex",e); mv.setViewName("ageError"); return mv; } @ExceptionHandler public ModelAndView doOtherException(Exception e ){ //处理其他位置的异常 ModelAndView mv=new ModelAndView(); mv.addObject("msg","未知异常"); mv.addObject("ex",e); mv.setViewName("defaultError"); return mv; } }
- 在类的上面加入
-
创建处理异常的视图页面
分别创建nameError、ageError和defaultError
nameError.jsp<br/> 提示信息:${msg}<br/> 异常信息:${ex.message}
-
创建springmvc的配置文件
- 组件扫描器扫描
@Controller
注解 - 组件扫描器扫描
@ControllerAdvice
所在的包名 - 声明注解驱动
<!--声明组件扫描器--> <context:component-scan base-package="com.mvc.controller"/> <!--声明视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--前缀:视图文件的路径--> <property name="prefix" value="/WEB-INF/view/"/> <!--后缀:视图文件的扩展名--> <property name="suffix" value=".jsp"/> </bean> <!--异常处理需要的两步--> <context:component-scan base-package="com.mvc.handler"/> <mvc:annotation-driven/>
- 组件扫描器扫描