概要
在最近的一个项目中,有一块代码实现源代码的清除.因为它有许多不同的调用,很有可能会产生六个不同的异常.原来的程序员在试图简化代码(或者保存键入程序)之后宣告:该程序还不止产生6个不同的异常.这就使得代码调用必须包装在一个可以捕捉exception 的try/catch 块中.该程序员确定:因为该代码用于清除源代码,失败并不重要,所以catch 块为空,就好像系统关闭了一样. 【程序编程相关:写一个登陆用的用户控件。】
java 提供了一个丰富的异常处理框架,但是许多程序员发现:跳过这个丰富的异常处理框架只使用类属exceptions要容易得多.本文探讨了产生.捕捉与忽视类属exceptions的风险,并为处理复杂软件项目内的一般的复杂异常建议了最好的处理方法. 【推荐阅读:《测试驱动开发》读书笔记之工具使用】 【扩展信息:RCP(Rich Client Plat】很明显,这不是最好的编程解决方法,但是好像也看不出有什么大的错误,除了在源代码的第三行有一个小小的逻辑问题:listing 1. original cleanup code private void cleanupconnections() throws exceptionone, exceptiontwo { for (int i = 0; i < connections.length; i++) { connection[i].release(); // throws exceptionone, exceptiontwo connection[i] = null; } connections = null; } protected abstract void cleanupfiles() throws exceptionthree, exceptionfour; protected abstract void removelisteners() throws exceptionfive, exceptionsix; public void cleanupeverything() throws exception { cleanupconnections(); cleanupfiles(); removelisteners(); } public void done() { try { dostuff(); cleanupeverything(); domorestuff(); } catch (exception e) {} }
在代码的另一个部分,connections 排列没有初始化,直到第一个连接创建为止.但是如果连接没有创见,那么连接排列则为null .所以在某些情况下,对connections[i].release()的调用将产生nullpointerexception.这也是一个相对容易的解决方法.只要添加一个对connections != null的检查. 但是,并没有报告异常.cleanupconnections()产生一个异常, cleanupeverything()又产生一个异常,最后异常被done()捕捉到.done()方法对一场不做任何处理,甚至也不记录一下.因为 只能通过done()调用cleanupeverything() ,所以看不到异常.因此代码也没有得到解决. 因此,在这个失败案例中,没有调用cleanupfiles()与removelisteners() 方法(所以它们的资源没有释放),也没有调用domorestuff(),这样done()中的最终处理没有完成.更糟糕的是,系统关闭时没有调用done();相反的,程序只调用done()来完成每个事务.所以每个事务中的资源都漏掉了. 这个问题无疑是一个主要的问题:错误没有报告,资源遗漏.... 下一页