您的位置:首页 > 编程语言 > Java开发

【SpringMVC】异常处理ExceptionHandlerExceptionResolver

2017-07-31 22:43 561 查看
      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中抛出的异常了

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: