- 浏览: 63370 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
maozilee:
试试先@@ 就喜欢开源的!
我的画流程图的开源工具 -
nything:
eccojap 写道1.信息渠道很重要。
2.内部推荐成功率比 ...
这几天找工作 -
xuehu2009:
谢谢您的指点
安装tomcat出错failed to install tomcat5 service问题的解决方法 -
night_lone:
eccojap 写道1.信息渠道很重要。2.内部推荐成功率比较 ...
这几天找工作 -
eccojap:
1.信息渠道很重要。
2.内部推荐成功率比较大。
社会是不公平 ...
这几天找工作
在JE中一为仁兄的博客中看到一篇关于异常的好文章。
原文地址:http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html
所以也想来温习哈异常知识。
优秀的程序员都想写出质量高的代码,就必须控制好异常的用法,异常用的好,可以优化代码,否则,就会产生副作用,因为如果没有把异常用好的话,异常反而会导致你的程序变慢,因为需要去花费内存和CPU资源去创建异常,抛出异常,捕获异常。还有,如果过多的使用异常,会导致程序很难看,头疼。
所以用好异常很重要。要不偏不倚,要小心的运用。
会抛出异常的三种情况:
1.Exceptions due to programming errors。
2.Exceptions due to client code errors
3.Exceptions due to resource failures
在JAVA中,主要有两大种类型的异常:
1.Checked exceptions:客户端代码必须处理API抛出的这类异常,该类异常继承于Exception。
2.Unchecked exceptions所有继承于
RuntimeException的异常都特殊对待,客户端代码不需要处理API抛出的这类异常。
关于异常这个话题,在JAVA社区和C++社区一直辩论不休。辩论的主题起源于:JAVA好像是第一个主流的带有checked Exception的面向对象的语言。C++和C#中没有checked Exception,他们中的所有异常都是unchecked Exception。
到底什么是Checked Exception?
它就是一种在低层方法中抛出,在高层调用方法中强制处理。
如果客户端代码(client code)不能高效的处理异常,Checked Exception这种强制执行,就会加重API和client code之间的负担。
有的程序员会采取这样的捷径:制止异常在一个空的catch块中,或者仅仅在方法中抛出异常,其实这就是把负担转移给客户端的调用者。
废话说了那么多,现在来看看主题,怎么样去设计一个合适的抛出异常的API?
1.当选择异常类型checked 或Unchecked时候,就问自己:当异常发生时,客户端代码能做什么?
如果客户端代码能够恢复异常,就选择checked异常;如果客户端不能做什么,就选择Unchecked Exception.
输出一点错误日志,对恢复并没有作用。
异常发生时客户端的反映 | 异常类型 |
客户端代码不能做任何事 | unchecked Exception |
客户端代码根据异常信息会采取有用的恢复的action | checked Exception |
一般对于程序性错误,更喜欢选择unchecked Exception.因为它不会强迫客户端API去明显的处理它们。一般我们更倾向地使用标准的API,不会去设计自己的Exception.
2.保护封装性
永远不让有特殊实现的checked Exception扩大到更高的层。比如:不要让来自数据访问层的SQLException传播到业务逻辑对象层。业务逻辑层根本不需要知道
SQLException。有两种方法可以来优化:
一,Convert SQLException
into another checked exception, if the client code is expected to recuperate from the exception.
二,Convert SQLException
into an unchecked exception, if the client code cannot do anything about it.
一般情况下,客户端代码不会做任何事情,所以不要迟疑去把它转换成unchecked Exception。
看看下面的代码段:
public void dataAccessCode(){ try{ ..some code that throws SQLException }catch(SQLException ex){ ex.printStacktrace(); } }
上面的catch块,仅仅禁止了代码的执行,并没有做任何事情。既然我们的客户端代码不能对异常做任何事情,为何不将上面的代码写成如下这样:
public void dataAccessCode(){ try{ ..some code that throws SQLException }catch(SQLException ex){ throw new RuntimeException(ex);//关键,抛出unchecked Exception } }
上面的代码已经将SQLException转换成了RuntimeException,如果
SQLException发生,就将抛出一个新的
RuntimeException.这时程序的执行就会被搁置,异常被报告。这样做的好处是,不会让不必要异常处理破坏业务逻辑层的数据。
如果你有信心在业务逻辑层能够恢复SQLException
异常,也可以将SQLException转换成一个更有意义的checked exception.但是我发现在大多数情况下,
RuntimeException足以应付了。
3.不要创建不能给客户端代码提供任何信息的异常。
看看下面的代码有什么错误?
public class DuplicateUsernameException extends Exception {}
因为它没有给客户端代码提供任何有用的信息,只是显示出是一个异常。Exception类也象其他普通的类一样,也可以在类中提供方法,给客户端代码调用而取得一些信息。
我们可以给 DuplicateUsernameException添加一些有用的方法。
public class DuplicateUsernameException extends Exception { public DuplicateUsernameException (String username){....} public String requestedUsername(){...} public String[] availableNames(){...} }
这样客户端代码就可以调用requestedUsername()方法获取请求的用户名信息,如果不想添加额外的信息,也就可以抛出一个标准的异常,如:
throw new Exception("Username already taken");
更好的,你如果认为客户端代码不会做任何事,只是输出一个日志信息,就可以这样做:抛出一个unchecked Exception
throw new RuntimeException("Username already taken");
下面是使用异常应该注意的技巧:
1. Always clean up after yourself
如果你正在使用数据库连接或网络连接这样的资源,你必须确定清理掉它们。如果你调用的API也仅仅是调用的unchecked exception的话,使用完资源后,也要注意用try--finally blocks来清理。
比如:
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);//抛出unchecked exception } } }
DBUtil就是一个用来关闭连接的工具类。关键点就是finally 块的使用,无论异常是否被捕获,它都会执行。
2. Never use exceptions for flow control
3. Do not suppress or ignore exceptions
4. Do not catch top-level exceptions
5. Log exceptions just once
发表评论
-
java main函数命令行传参星号*处理
2009-10-18 21:57 1334默认情况下,操作系统对星号*的处理,是当做通配符。 ... -
Java SE 6.0加强了JDBC 4.0
2009-01-15 22:23 978Java SE 5.0(代码叫做:Tiger 老虎) Java ... -
RMI初探
2008-11-27 14:24 647RMI是一种调用远程主机上方法的分布式技术。它主要有两个对象: ... -
JDK工具库
2008-11-27 12:57 899工具库主要有7种主要程序: javac: Java编译器,将源 ... -
一个数组声明的题目
2008-11-17 17:09 761which of the followiing are val ... -
正则表达式初探
2008-11-17 16:32 662在JDK中的正则引擎主要有五个类:ASCII.class ... -
String 与StringBuffer的关键点
2008-11-17 14:23 833StringBuffer关键点: 1.简单认为.appe ... -
抽象类与接口
2008-11-17 10:45 797对java抽象类的理解如下 ... -
不能继承的情况
2008-11-17 10:01 680匿名的内部类是没有名字的内部类,不能extends其他类,但一 ... -
super和this
2008-11-17 09:16 773子类里的构造函数如果要引用super的话,必须吧super放在 ... -
重载与覆盖的区别
2008-11-17 09:02 736重载与覆盖的区别在于方法体不同。 成员函数被重载的特征如下: ... -
有异常的代码性能比没有用异常的性能还好??
2008-11-16 21:43 802看以下两段代码:A package net.betterjav ... -
高质量程序设计--异常
2008-11-16 19:30 793异常处理,是Java中最强大,也是最容易被误用的机制。 使用异 ... -
计算程序运行时间的代码
2008-11-16 09:19 858在编码时候,有时候要比较不同方案的性能,就需要比较她们运行的时 ... -
ArrayList Vector LinkedList 区别与用法
2008-11-14 15:33 1015ArrayList 和 Vector 是采用数组方式存储数据 ... -
线程同步知识
2008-11-12 16:25 733在论坛里看到一篇讲线 ... -
java.util#List.java初读
2008-11-11 13:23 1307List是一种有序的集合(An ordered collect ... -
java.util#Arrays.java初读
2008-11-11 09:32 1086Array类封装了很多操作 ...
相关推荐
- Best practices for optimizing the run-time image for different hardware configurations. **6. Developing Multi-threaded System Applications** - Principles of multi-threading and its importance in ...
在自动化项目中,遵循最佳实践是非常重要的。开发者需要遵循一些基本原则,例如删除无用的变量、删除禁用代码等,以提高项目的可读性和可维护性。 UiPath Robotic Enterprise Framework UiPath Robotic Enterprise...
Like its predecessors, this fifth edition of Oracle PL/SQL Programming covers language fundamentals, advanced coding techniques, and best practices for using Oracle’s powerful procedural language....
This tutorial explains how to set up log4j with email, files and stdout. It compares XML to properties configuration files, ...Furthermore, we explain best practices on logging and exception handling.
The chapter covers best practices for defining and using macros, including the importance of understanding macro expansion. Other topics include avoiding common pitfalls related to preprocessor ...
1. 异常处理(Exception Handling):C++中的异常处理机制是其强大特性之一,用于在程序中优雅地处理错误。书中详细介绍了何时、如何以及为何要使用try、catch和throw语句,以及如何设计和使用异常安全的代码。 2. ...
Master foundational techniques, idioms, and best practices for writing superior Java code Leverage the power of interfaces, lambda expressions, and inner classes Harden programs through effective ...
6. **异常处理(Exception Handling)**:Struts2提供了一套优雅的异常处理机制,包括全局异常映射和动作级别的异常处理。这部分可能详细阐述如何配置和实现自定义的异常处理器。 7. **国际化...
The authors approach each subject with practical advice and present best practices, tips, and tricks for solving problems. Throughout, you’ll find detailed explanations, solutions for the “pain ...
This edition introduces new object relevant features such as traits, reflection extension additions, callable type hinting, improvements to exception handling, and many smaller language enhancements....
Apply best practices to your WCF services and utilize Entity Framework to access underlying data storage A step-by-step, practical guide with nifty screenshots to create six WCF and Entity Framework ...
8. **Best Practices(最佳实践)**:源码可能还展示了如何安全地存储和传递密钥,以及如何利用加密服务提供者(CSP,Cryptographic Service Provider)等安全组件。 通过分析这个实例源码,你可以了解到如何在C#中...
This edition also includes C# Coding Guidelines that call attention to today's best practices for writing C# code. Separate indexes of C# versions 3.0, 4.0, and 5.0 make it easy to find answers ...
9. **最佳实践(Best Practices)**: 虽然这个登录示例简化了实际应用中的许多细节,但在真实的系统中,通常会使用更安全的方法来处理用户认证,例如哈希和盐值对密码进行加密,以及使用参数化查询或存储过程来...
- **Best Practices**: Following guidelines for maintainable and efficient code. ### Conclusion The SCJP6 Sun Certified Programmer for Java 6 Study Guide (Exam 310-065) is a comprehensive resource ...
Exception handling and transaction management with Mule Chapter 10. Securing Mule Chapter 11. Tuning Mule Part 3: Traveling further with Mule Chapter 12. Developing with Mule Chapter 13. Writing ...
7. **安全实践(Security Best Practices)**:为了确保用户数据的安全,开发者需要遵循一些最佳实践,如使用HTTPS协议传输敏感数据、避免SQL注入、限制密码尝试次数等。 8. **角色管理(Role Management)**:在...