Java异常分类和统一处理

异常分类

Java异常分为"检查"和"非检查"两类,"检查"二字的意思是,代码编译时,编译器会去Check一下有没有进行异常处理(捕获或向上抛),对于归类为需要检查的异常,若没处理,编译就会报错过不去。

初学Java时常常想Exception为什么要这样分类? 后来逐渐明白,发生异常的原因不过两种:主观和客观,前者大多数情况下可以避免,后者大多数情况下无法避免。

像 NullPointerException 这类异常,大多跟程序员的主观素质挂钩(开发好,测试好, 基本不会在系统运行后蹦出来), 基本是可以避免的,没有必要额外地干预,Java语法把它们归类为‘非检查异常',也算给程序员和编译器省了不少事;

而另一种像 IOException 这类跟外在客观环境挂钩的异常,很多时候是无法避免的(指不定哪一天哪一秒网络就堵塞了或者直接挂掉),所以编译器有必要督促一下程序员,Check一下,看看是否对这些可能不期而至的异常进行了处理。当Exception对象传递到某个节点并不再向上抛出时,程序就可以有所作为了,比如:给用户返回一个友好的提示("系统繁忙,请重试"),或者给运维部小王发送一个预警消息。


异常的统一处理

1,服务器处理

以Tomcat和Nginx为例

Tomcat是Servlet容器,主要处理动态请求,在web.xml下,可以通过Http返回码或Exception类型来指定异常时返回的页面:

Java异常分类和统一处理

Nginx是反向代理服务器,通过Http返回码也可以很方便地指定异常时的返回页面:

Java异常分类和统一处理

2,框架处理

以Spring MVC为例

框架支持3种方式:

(1)使用框架自带的简单异常处理器 SimpleMappingExceptionResolver;

(2)实现HandlerExceptionResolver接口,自定义异常处理器;(可以支持Ajax返回等扩展)

(3)使用@ExceptionHandler注解;

第(1)种,自带的异常处理器

在spring-mvc.xml下配置:

Java异常分类和统一处理

缺点:不方便返回Json格式的错误信息。

第(2)种,自定义异常处理器

通过自定义实现类,可以判断当前请求是否是Ajax,以决定是返回Html还是Json,也可以在此实现一些功能扩展(比如异常统计),简单代码如下:

Java异常分类和统一处理

第(3)种,@ExceptionHandler注解

Java异常分类和统一处理

缺点:@ExceptionHandler的方法,必须和可能抛异常的方法在同一个Controller下。

3,结合使用

实际在处理异常的返回时,会将返回码的映射交给服务器,将动态请求的一些自定义异常或者功能扩展交给框架。

PS:欢迎指点,不甚感激。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值