发表于: 2018-01-31 23:28:57
1 634
今天做的事情:小课堂&&指导师弟
大家好,我是IT修真院上海分院第5期的学员卢炳伸,一枚正直纯洁善良的JAVA程序员
今天给大家分享一下,修真院官网JAVA任务二,扩展知识中的知识点——异常处理
1.背景介绍
异常分类
异常类分两大类型:Error类,Exception类 ,它们有共同的父类Throwable。Error类代表了编译和系统的错误,不允许捕获;属于JVM运行中发生的一些错误,虽然并不属于开发人员的范畴,但是有些Error还是由代码引起的,比如StackOverflowError,栈溢出。这个经常由递归操作引起 ,或者是一些循环引用情况...而Exception分为两种,检查类型(checked)和未检查类型(unchecked)。检查类型的异常就是说要程序员明确的去声明或者用try..catch语句来处理的异常,而非检查类型的异常RunTImeException则没有这些限制(也就是说在方法里面不用声明throw)。
2.知识剖析
概述
为什么要处理异常?
举一个最简单的例子,我们在数据库里面设置用户名的字段长度为varchar(20),这时候,用户要是在注册的时候,输入了一个长度为30的用户名,假设数据没有被校验,一直传到了dao层,那么在尝试插入的时候很有可能就会抛出异常;再换个例子,比如说我设置用户名为唯一索引,用户注册时如果用户名重复,而设计上并没有重复校验的时候,也会抛出异常。当然,实际的问题远不止这些,有些东西,有些细节,有些异常根本是无法预测到的,所以,必须针对在不同方法抛出的各种异常,进行特定的处理,哪怕是预料之外的东西,也要打印异常信息,为后续的排查BUG做准备。
3.常见问题。
概念:吞食则有害(出自thinking in java)
当try块吞入一大块的代码,并且统一(一般是exception)catch时,其实是有风险的,因为这一大块的代码块里面包含有由各种原因造成的异常,而有些异常是需要及时处理的。如果try catch捕获了这些异常,却不进行正确的处理(比如只打印一下日志什么的),就会造成很大的隐患,使得程序在没有处理异常的情况下继续运行下去。这是相当危险的,就好比一个人吞进去了很多东西,却消化不了。如果这是一枚铁钉呢?如果不及时处理....后果不可想象。
4.解决方案
利用SSM框架自带的异常处理器,完成对异常的统一处理。
需要实现HandlerExceptionResolver接口,并且在springmvc.xml注册这个bean。
5.编码实战
重抛异常和自定义异常
这里的StudentException是我自定义的,用来标记所有我预测的可能由用户产生的异常:
在可能会产生异常的地方捕获原异常,并且重抛,然后在异常处理器中进行统一处理:
异常链
要注意到,重抛异常的时候,会丢失原异常的信息。若想保留这些信息,可以用异常类下的initCause()方法。
分类处理异常:
6.扩展思考
在Nginx完成对异常页面的拦截
但是,这个异常处理器是SpringMVC的一个配件,依然有其他地方的异常是无法处理得到的。因此,我们要在nginx这个反向代理服务器的配置文件中设置异常页面的拦截,以确保没有漏网之鱼。
7.参考文献
http://blog.csdn.net/qq_38173593/article/details/73822956
https://my.oschina.net/guanhe/blog/1204598
《JAVA编程思想》
明天要做的事情:任务六
问题:暂无
收获:温故而知新
评论