欢迎使用我的 在线工具

小D

读历史、看小说、写程序都是我所爱。技术不好,头脑不灵光,靠的是兴趣。
随笔 - 35, 文章 - 25, 评论 - 13, 引用 - 0
数据加载中……

Java异常使用的“最佳实践”

下面作者将介绍界中使用异常的最佳实践( Best Practices for Using Exceptions
1
总是要做一些清理工作( Always clean up after yourself
如果你使用一些资源例如数据库连接或者网络连接,请记住要做一些清理工作(如
关闭数据库连接或者网络连接),如果你的 API 抛出 Unchecked exception ,那么你
要用 try-finally 来做必要的清理工作:
public void dataAccessCode(){
Connection conn = null;
try{
conn = getConnection();
..some code that throws SQLException
}catch(SQLException ex){
ex.printStacktrace();
} finally{
DBUtil.closeConnection(conn); } }
class DBUtil{
public static void closeConnection
(Connection conn){
try{
conn.close();
} catch(SQLException ex){
logger.error("Cannot close connection");
throw new RuntimeException(ex); } } }
DBUtil
是一个工具类来关闭 Connection. 有必要的说的使用的 finally 的重要性是不
管程序是否碰到异常,它都会被执行。在上边的例子中, finally 中关闭连接,如果
在关闭连接的时候出现错误就抛出 RuntimeException.
2
不要使用异常来控制流程( Never use exceptions for flow control
下边代码中, MaximumCountReachedException 被用于控制流程:
public void useExceptionsForFlowControl() {
try {
while (true) {
increaseCount(); }
} catch (MaximumCountReachedException ex) { }
//Continue execution }
public void increaseCount()
throws MaximumCountReachedException {
if (count >= 5000)
throw new MaximumCountReachedException(); }
上边的 useExceptionsForFlowControl() 用一个无限循环来增加 count 直到抛出异常
,这种做法并没有说让代码不易读,但是它是程序执行效率降低。
记住,只在要会抛出异常的地方进行异常处理。
3
不要忽略异常
当有异常被抛出的时候,如果你不想恢复它,那么你要毫不犹豫的将其转换为
unchecked exception
,而不是用一个空的 catch 块或者什么也不做来忽略它,以至
于从表面来看象是什么也没有发生一样。
4
不要捕获顶层的 Exception
unchecked exception
都是 RuntimeException 的子类, RuntimeException 又继承
Exception,
因此,如果单纯的捕获 Exception, 那么你同样也捕获了
RuntimeException,
如下代码:
try{ ..
}catch(Exception ex){ }
一旦你写出了上边的代码(注意 catch 块是空的),它将忽略所有的异常,包括
unchecked exception.
5
Log exceptions just once
Logging the same exception stack trace more than once can confuse the
programmer examining the stack trace about the original source of
exception. So just log it once.
总结
这里给出了一些关于异常处理的一些最佳实践,我并不想开始另一轮的关于 checked
exception
unchecked exception 的争论。你可以根据自己的实际情况定制自己
异常处理,我坚信我们将有更好的办法来处理我们代码中的异常。
在此,我将感谢 Bruce Eckel, Joshua Kerievsky, Somik Raha 对于写这篇文章所
给于我的支持。

 

我的理解:

1 .尽量不要在发布的程序中使用打印调用栈的信息处理异常,因为这样在发布的程序中根本不可见,就如同忽略处理异常一样。而是要么将其处理,要么将其包装后抛出,我们对于客户端不能处理,也没必要处理的异常通常包装为 RuntimeExcepion 这样客户程序可以选择是否获取其异常信息,给客户程序一个选择处理的机会。如:显示到客户端。更不要忽略异常,记住只打印调用堆栈和忽略异常是等价的,当然开发及调试的时候除外。

2 .因为异常是非常消耗资源的,所以不要使用异常做流程控制。

3 .总是优先使用 UnCheckedException

4 .不要自定义过多的异常类,因为 Java 的异常信息已经将这个异常描述得够清晰了。要么使这个异常类承担更多的责任。

5. 不要将过多的代码写入到一个 try 语句中,通常 try 语句只包含需要处理的代码。

6. Checked 异常只是为了使程序员写出更健壮的代码而发明的。但是由于设计的失误对于一些无法恢复,或者很难恢复的异常也作为 Checked 异常 是一个错误的决定。事实证明不适用的 Checked 异常的 C++ C# 的异常处理机制比 Java 更成功。

7. 不要在程序中包含过多的异常处理语句,这样会使你的语句难以理解,会使你的程序的效率变慢。只在需要的处理的地方处理异常

8. 不要把底层的异常抛给业务层,要么处理要么包装后抛给业务层。因为业务层不关心这个。

9. 对于能处理的异常尽量处理,否则抛出。优先考虑 RuntimeExcepion 包装。

posted on 2009-11-04 20:55 vagasnail 阅读(480) 评论(0)  编辑  收藏 所属分类: Java


只有注册用户登录后才能发表评论。


网站导航: