spring全局异常处理及try、catch、finally、throw

JAVA异常处理

异常处理机制是保证异常处理完毕后,程序能够继续运行程序并返回数据
java的异常处理是通过5个关键字来实现的:try、catch、finally、throw、throws。throw 是直接抛出一个异常;throws声明方法可能会出现异常,表示如果抛出异常,则由该方法的调用者来进行异常处理。

try-catch-finally结构中try块是必须有的,catch和finally块为可选,但两者至少必须出现其中之一。finally是程序一定会执行的代码,在任何执行try或者catch中的return语句之前,都会先执行finally语句,如果finally中有reture程序就直接返回了,不再执行try或catch中的return语句。

spring可通过@ControllerAdvice + @ExceptionHandle 注解处理全局异常

spring全局异常处理的一种方式


@ControllerAdvice
@ResponseBody
public class RestExceptionHandler {

	private static Logger logger = LogManager.getLogger(RestExceptionHandler.class.getName());

	/**
	 * 运行时异常
	 * @param e
	 * @return
	 */
	@ExceptionHandler({ RuntimeException.class, ConversionNotSupportedException.class,
			HttpMessageNotWritableException.class})
		public ResultMap runtimeExceptionHandler(Exception e) {
		ResultMap resultMap = new ResultMap();
		logger.error(ExceptionUtils.getFullStackTrace(e));
		resultMap.failure("服务器运行时异常", 500);
		return resultMap;
	}
	...
}
可以定义自己想要返回的数据格式或错误界面,但是这种方式处理不了404异常

上面的配置处理不了404异常的原因是,在DispatcherServlet源码中当找不到处理请求的Handler时,会调用noHandlerFound方法:
springmvc noHandlerFound源码
如上图所示,当请求找不到处理器时会根据throwExceptionIfNoHandlerFound(默认为false)的值确定是抛出NoHandlerFoundException异常,还是重定向到error页面。

如果我们想全局异常处理能够处理404请求,需要程序能够抛出NoHandlerFoundException异常,则需要把throwExceptionIfNoHandlerFound属性值设置为true。
1、SSM项目中的设置throwExceptionIfNoHandlerFound属性的方法:

<servlet>
		<servlet-name>servletDispatcher</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/springmvc-main.xml</param-value>
		</init-param>
		<init-param>
			<param-name>throwExceptionIfNoHandlerFound</param-name>
			<param-value>true</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>servletDispatcher</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>

这个地方有一个坑就是如果我们启动默认的Servlet来响应静态文件 那么web.xml设置的throwExceptionIfNoHandlerFound 就会失效,缺省 Servlet HTTP 请求处理器 DefaultServletHttpRequestHandler的启动方式是在xml中配置

<mvc:default-servlet-handler />

2、springboot项目比较简单application.yml中配置

spring:
  mvc:
    throw-exception-if-no-handler-found: true

如上配置后404请求能被全局异常处理器处理。

记一次try catch捕获异常的坑:

public boolean handDump(String authToken, Date date, String source) {
        boolean resp = false;
        List<Map<String, Object>> dataList = null;
        try {
            int a = 1/0;
            resp = true;
        } catch (Exception e) {
            resp = false;
            throw new RuntimeException();
        } finally {
            //System.out.println("我执行了");
            return resp;
        }
    }
因为在finally中存在reture语句,所以catchthrow语句并没有执行的机会。全局异常处理器也就没有捕获到这个异常,建议finally中不要出现return语句。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值