spring 处理异常
Posted code前行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring 处理异常相关的知识,希望对你有一定的参考价值。
一、将异常映射为HTTP状态码
(本篇所用代码承接 构建 Spring web 应用程序中的)
首先自定义一个异常类 SpittleNotFoundException
import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; /* * ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Spittle Not Found") 将该异常映射为 HTTP 404 ,切返回信息为 Spittle Not Found */ @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Spittle Not Found") public class SpittleNotFoundException extends RuntimeException { private static final long serialVersionUID = 1L; }
然后在应用中合适的时候抛出该异常
//接受请求的输入 @RequestMapping(method=RequestMethod.GET) public List<Spittle> spittles(@RequestParam(value="max", defaultValue="30") long max, @RequestParam(value="count", defaultValue="20") int count) { System.out.println("pppppp"); //List<Spittle> list = repository.findSpittles(Long.MAX_VALUE, 20); List<Spittle> list = null; if (list == null || list.size() <= 0) { throw new SpittleNotFoundException(); } return list; }
浏览器返回如图
二、异常的统一处理
如果在方法中频繁的抛出同一种异常,并对其进行处理的话很繁琐如
try { //do something ...... } catch (Exception e) { //do something ...... }
这样会繁琐的处理同一种异常,这种情况我们可以添加一个新的方法,它会处理所有当前控制器中抛出的你所指定的异常
@ExceptionHandler(SpittleNotFoundException.class) public String handkeSpittleNotFoundException() { return "home"; }
加上@ExceptionHandler注解,该方法会处理当前控制器中所有的 SpittleNotFoundException 异常
但是如果多个控制器中都需要对同一种类型的异常做相同的处理呢?当然我们可以创建基类,实现这个异常处理方法,然后所有的控制器都从基类中派生。但是,有更简单的方法,此时可以用控制器添加通知。
三、为控制器添加通知
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; /* * 控制器通知是任意带有 @ControllerAdvice 注解的类, 这个类会有一个或多个如下类型的方法 * @ExceptionHandler * @InitBinder * @ModelAttribute */ @ControllerAdvice public class AppWideExceptionHandler { @ExceptionHandler(SpittleNotFoundException.class) public String handkeSpittleNotFoundException() { return "home"; } }
这样,AppWideExceptionHandler 类就可以处理当前应用中所有控制器所抛出的 SpittleNotFoundException 异常
以上是关于spring 处理异常的主要内容,如果未能解决你的问题,请参考以下文章
PCL异常处理:pcl 1.8.13rdpartyoostincludeoost-1_64oost ypeofmsvc ypeof_impl.hpp(125): error(代码片段