Java 异常处理最佳实践
?
原文地址:http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html?page=11.API设计最佳实践:当在检查异常和非检查异常中摇摆时,自问一下:客户端代码在异常发生时能做什么?如果客户端代码什么都做不了:那么生成一个无需捕获的异常。如果客户端代码能从异常中获取有效信息恢复程序状态,则使用检查异常。减少自定义异常可以减少异常轨迹跟踪,作者不推荐自定义异常。
2.保护封装不要让特定异常上传的高层。比如SQL异常就不要传播到BO层。处理方法有二:1.转换SQLException到另一种检查异常,如果客户端代码希望从异常中恢复的话。2.不希望恢复的话就使用非检查异常。处理方式
public void dataAccessCode(){ try{ ..some code that throws SQLException }catch(SQLException ex){ throw new RuntimeException(ex); }}
要优于public void dataAccessCode(){ try{ ..some code that throws SQLException }catch(SQLException ex){ ex.printStacktrace(); }}
3.不要尝试创建新的自定义异常如果它们对客户端代码而言不包含有用信息的话。对于没有添加有用方法或属性的异常,还是使用标准异常而不是自定义异常比较好。
4。为异常写文档说明:可以使用Javadoc's @throws标签为异常写文档说明。为了放置文档和实现不统一,可以为异常抛出写单元测试
public void testIndexOutOfBoundsException() { ArrayList blankList = new ArrayList(); try { blankList.get(10); fail("Should raise an IndexOutOfBoundsException"); } catch (IndexOutOfBoundsException success) {}}
使用异常的最佳实践:1.总是清理你使用过的资源。
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); } }}
2.不要为流程控制使用异常3.不要挂起或者忽略异常4.不要捕获顶级异常在捕获Excepiton时,因为RuntimeException是Exception的子类,它就可能被忽略。5.只记录一次异常