异常处理,英文名为exceptional handling, 是代替日渐衰落的error code方法的新法,提供error code
所未能具体的优势。异常处理分离了接收和处理错误代码。这个功能理清了编程者的思绪,也帮助代码增强了可读性,方便了维护者的阅读和理解。
java语言中,异常处理可以确保程序的健壮性,提高系统的可用率.但是java api 提供的异常都是比较低级的,所以有了'提倡异常封装’
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZukXbm12al5Wbtdna0F3dywGMwIDNyIzLcFzMvw1NwMTMwIzLc1Wdy9mZvwVbvNmLpVXat5yciJmLoNWY0RXYvw1LcpDc0RHaiojIsJye.gif)
异常封装有三个优点: 1)提高系统的友好性 2)提高性能的可维护性 3)解决java异常机制自身的缺陷
提高系统的友好性
系统的友好性,就像系统和开发人员等握手与交流.好的系统对象,会展现出交流时候所需要的一切.因此,良好的友好性需要良好的代码告诉开发人员和用户.开发人员要找需要打印出堆栈信息.
show the code:
::throw new mybussinessexception(e);
在这里,无效文件导致了两点:文件未找到和该业务出现问题.因此,在文件未找到之后我们可以继续根据需要告之其他异常.
提高性能的可维护性
如何提搞可维护性,大家不能一味的进行这样操作,就抛出exception,这样会导致别人看你的代码完全check不到异常点.下面的代码是不可取的:
正确的做法是对异常进行分类处理,并进行封装输出.
catch{}
这样子,直接在代码层级上分析即可,代码异常在哪里抛出.维护人员看到这样的异常也会有了准确的判断.
解决java异常机制自身的缺陷
先抛出个问题:例如注册时,要对很多进行检验.像密码,用户名,邮箱…...这样情况下,我们必须要在一个注册方法里面抛出很多个异常.因此,正确的方法是封装异常,建立异常容器,一次性对某对象进行校验,然后返回所有异常.
show the code
异常容器:
处理异常:
我们做的jee项目时候,一般会有三层的结构:持久层,逻辑层,展现层.异常也是如此的,当我们各个层之间传递异常,我们就需要先封装,然后传递.简要的就是采用异常传递异常:
[摘自源码分析]
从中我们可以抽取的看到:
jdbc执行sql语句查询的时候,先抛出sqlexception ,然后就像一条链一样,下一步告诉别人是jdbc的异常.下面体会经典,休息下:
所有受检异常(checked exception)是好事,为何要尽可能转化为非,也就是(unchecked exception)呢?我的理解是:受检异常威胁到系统的安全性,稳定性,可靠性,正确性时,不能转换为非受检异常.
也就是说,其中存在的受检异常有缺点,转换成unchecked exception就轻松解决了.
受检异常使接口声明脆弱
throws mysecurityexception;
这里面不一定只是一个异常,然而定义了异常,会增加了接口的不稳定性,这就存在了面向对象设计的严重亵渎,如果要改变的话,又破坏了封装性.
另外,受检异常还有两个缺点:
受检异常使代码可读性降低
受检异常增加了开发工作量
“性能问题不是拒绝异常的借口” 就当一个常见的登录用例.我们经常会添加一个例外的事件:”连续登录3次登录失败,暂时锁定用户帐号.”这样这个例外的事件就是一个异常处理.
这样子一来,代码逻辑很清晰.但是这样子就抛出了一个主意.这样子有代价:
性能比较慢
java的异常处理机制确实比较慢,这个性能慢是相对的.相对那些基础类型:string integer…等.有人测试结果如下:
相当于创建每个异常对象是普通对象的五倍.但是数量级上是 ms,在一个系统中,如此微小的性能消耗是可以允许的.
经验之谈:”用对了地方就好,用错了地方就不好。”这是我的师傅跟我说的,他教会了很多.太很抽象,我想我会慢慢学会的.
实际j2ee项目中,通常一个页面请求到达后台以后,首先是到mvc中的controller,在controller层会调用业务逻辑层
service,而在service层会调用持久层dao进而获得数据,再将获得的数据一层一层返回到controller层,然后通过
controller控制层转发到指定页面.
可能存在的异常:
dao层可能会发生sqlexception异常
service层可能会发生nullpointexception异常,
controller层可能会发生ioexception异常,runtimeexception异常
正确的处理方式
根据上面知识的说法:我们该用以下的方法来实现
<a href="http://www.cnblogs.com/alandre/p/3794513.html#jeffli_h2">提倡异常封装</a>
throw new entityexception("error! when save the entity",e);
这里用了链式异常抛出:entityexception是自定义的异常类:
自然还有些什么拦截器抛出异常,在这里就不详细展开讨论了.