天天看点

编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理何为异常处理?提倡异常封装采用异常链传递异常受检异常尽可能转化为非受检异常 多使用异常,把性能问题放一边java web 中的异常处理

异常处理,英文名为exceptional handling, 是代替日渐衰落的error code方法的新法,提供error code

所未能具体的优势。异常处理分离了接收和处理错误代码。这个功能理清了编程者的思绪,也帮助代码增强了可读性,方便了维护者的阅读和理解。

java语言中,异常处理可以确保程序的健壮性,提高系统的可用率.但是java api 提供的异常都是比较低级的,所以有了'提倡异常封装’

编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理何为异常处理?提倡异常封装采用异常链传递异常受检异常尽可能转化为非受检异常 多使用异常,把性能问题放一边java web 中的异常处理

异常封装有三个优点:  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是自定义的异常类:

自然还有些什么拦截器抛出异常,在这里就不详细展开讨论了.