一、异常处理思路
异常捕获的是unchecked型异常,因为checked异常在代码中年已经处理过,当然是在使用try-catch处理。这里首先使用ExceptionHandler捕获全局异常,这样如果是程序中有运行时异常就可以被随时捕获到,并将必要信息返回给调用者。对于使用try-catch捕获的异常,先创建自定义的运行时异常类,然后手动抛出。另外,在service使用unchecked异常可以触发事务回滚。
二、try-catch手动抛出异常代码演示
spingboot全局异常创建:
package com.dbzx.exception; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import com.dbzx.common.ResultModel; /** * 拦截异常后返回json信息,如果需要返回html页面,需要通过ModelAndView返回 * @author * */ @RestControllerAdvice public class JsonResultExceptionHandler { @ExceptionHandler(value = Exception.class) public ResultModel defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception { e.printStackTrace(); return ResultModel.errorException("异常信息:"+e.getMessage()); } }
自定义异常类:
package com.dbzx.exception; public class CustomUncheckException extends RuntimeException{ /** * */ private static final long serialVersionUID = 1L; public CustomUncheckException() { super(); } public CustomUncheckException(String msg) { super(msg); } public CustomUncheckException(String msg,Throwable cause) { super(msg,cause); } }
调用代码:
package com.dbzx.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.dbzx.common.ResultModel; import com.dbzx.exception.CustomUncheckException; import com.dbzx.service.UserService; @RestController @RequestMapping("dbzx") public class HelloController { @Autowired UserService userService; @RequestMapping("/hello") public ResultModel hello() { try { int i = 1 / 0; } catch (Exception e) { throw new CustomUncheckException(e.getMessage()); } return ResultModel.ok("hello"); } }
调用结果:
{ "status": 555, "msg": "异常信息:/ by zero", "data": null }