异常分类
Java异常分为"检查"和"非检查"两类,"检查"二字的意思是,代码编译时,编译器会去Check一下有没有进行异常处理(捕获或向上抛),对于归类为需要检查的异常,若没处理,编译就会报错过不去。
初学Java时常常想Exception为什么要这样分类? 后来逐渐明白,发生异常的原因不过两种:主观和客观,前者大多数情况下可以避免,后者大多数情况下无法避免。
像 NullPointerException 这类异常,大多跟程序员的主观素质挂钩(开发好,测试好, 基本不会在系统运行后蹦出来), 基本是可以避免的,没有必要额外地干预,Java语法把它们归类为‘非检查异常',也算给程序员和编译器省了不少事;
而另一种像 IOException 这类跟外在客观环境挂钩的异常,很多时候是无法避免的(指不定哪一天哪一秒网络就堵塞了或者直接挂掉),所以编译器有必要督促一下程序员,Check一下,看看是否对这些可能不期而至的异常进行了处理。当Exception对象传递到某个节点并不再向上抛出时,程序就可以有所作为了,比如:给用户返回一个友好的提示("系统繁忙,请重试"),或者给运维部小王发送一个预警消息。
异常的统一处理
1,服务器处理
以Tomcat和Nginx为例
Tomcat是Servlet容器,主要处理动态请求,在web.xml下,可以通过Http返回码或Exception类型来指定异常时返回的页面:
Nginx是反向代理服务器,通过Http返回码也可以很方便地指定异常时的返回页面:
2,框架处理
以Spring MVC为例
框架支持3种方式:
(1)使用框架自带的简单异常处理器 SimpleMappingExceptionResolver;
(2)实现HandlerExceptionResolver接口,自定义异常处理器;(可以支持Ajax返回等扩展)
(3)使用@ExceptionHandler注解;
第(1)种,自带的异常处理器
在spring-mvc.xml下配置:
缺点:不方便返回Json格式的错误信息。
第(2)种,自定义异常处理器
通过自定义实现类,可以判断当前请求是否是Ajax,以决定是返回Html还是Json,也可以在此实现一些功能扩展(比如异常统计),简单代码如下:
第(3)种,@ExceptionHandler注解
缺点:@ExceptionHandler的方法,必须和可能抛异常的方法在同一个Controller下。
3,结合使用
实际在处理异常的返回时,会将返回码的映射交给服务器,将动态请求的一些自定义异常或者功能扩展交给框架。
PS:欢迎指点,不甚感激。