【SpringMVC】异常处理ExceptionHandlerExceptionResolver

★★MVC 发表评论


      springmvc中出现异常不去处理,直接抛给springmvc框架。

主要处理Handler中用@ExceptionHandler注解定义的方法

@ExceptionHandler注解定义的方法优先级问题:

·发生空指针异常,但声明异常有runtimeexception和excetion,此时会根据异常最近继承关系找到继承深度最浅的那个

@ExceptionHandle注解方法标记了runtimeexception的方法

如果ExceptionHandlerExceptionResolver内部找不到@ExceptionHandler注解的话,会找@ControllerAdvice中@ExceptionHandler注解方法

 

jsp:

<a
href=“testExceptionHandlerExceptionResolver?i=10”>test ExceptionHandlerExceptionResolver</a>

 

控制器

@RequestMapping(“/testExceptionHandlerExceptionResolver”)

    public String testExceptionHandlerExceptionResolver(@RequestParam(“i”)
int
i
){

       System.out.println(“result:”+(10/i));

       return
“success”;

    }

当我们给i传参,程序出现异常,该如何处理?

在controller中增加如下方法,在注解value中可以指定处理的异常类

@ExceptionHandler({ArithmeticException.class})

    public
String handleArithmeticException(Exception
ex){

       System.out.println(出异常了:+ex);

       return“error”;

    }

结果:控制台打印出异常信息

综上:可以用一个方法和一个注解来解决异常处理问题,避免了struts2中通过excetion
Mapping映射来处理异常

 

注意几个细节:

1.       如何将异常信息返回到页面上呢?

尝试将异常信息装入map,再次请求

发现,异常处理方法不好使了

2.      
@ExceptionHandler
注解的方法入参中可以加入Exception类型的参数,该参数即对应发生的异常对象

3.       @ExceptionHandler方法的入参中不能传入map,若希望把异常信息传到页面上,需要使用ModelAndView作为返回值

改造处理:

error.jsp中加入spel表达式:

${exception}

控制器:

@ExceptionHandler({ArithmeticException.class})

    public
ModelAndView handleArithmeticException(Exception
ex){

       System.out.println(出异常了:+ex);

       ModelAndView
mv
=new ModelAndView(“error”);

       mv.addObject(“exception”,ex);

       return
mv;

}

4.  @ExceptionHandler标记的方法优先级问题

在controller中写了两个处理异常的方法,当发生异常时,优先被和异常最近的方法处理

@ExceptionHandler({RuntimeException.class})

    public ModelAndView handleArithmeticException2(Exception
ex){

      
System
.out.println(“[出异常了]+ex);

       ModelAndView
mv
=new ModelAndView(“error”);

       mv.addObject(“exception”,ex);

       return
mv;

    }

   

    @ExceptionHandler({ArithmeticException.class})

    public ModelAndView handleArithmeticException(Exception
ex){

      
System
.out.println(出异常了:+ex);

       ModelAndView
mv
=new ModelAndView(“error”);

       mv.addObject(“exception”,ex);

       return
mv;

}

 

5.       以上处理的都是一个局部handler的异常,如何配置全局的呢?

将控制器中的异常处理方法全部注释掉,这样就在当前的Handler中找不到@ExceptionHandler标记的可处理异常的方法,那么就去@ControllerAdvice

标记的类中找@ExceptionHandler标记的方法来处理异常

 

例如:新建一个类,在类中写上异常处理方法

@ControllerAdvice标记类,注册到spring容器中

@ControllerAdvice

public
class
HandlerException {

       @ExceptionHandler({ArithmeticException.class})

       public ModelAndView handleArithmeticException(Exception
ex){

         System.out.println(“—->
出异常了:+ex);

         ModelAndView
mv
=new ModelAndView(“error”);

        
mv
.addObject(“exception”,ex);

         return
mv;

       }

}

结果:加入控制器增强处理后,可以处理controller中抛出的异常了

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *