最近发现做过的系统,对异常没有很好的处理,看了些资料,整理如下:
1,java异常分类
(1)Checked exception: 这类异常都是Exception的子类,需要程序捕获处理的。
(2)Unchecked exception:
这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是特殊的,它们
不能通过程序来试图解决,所以称为Unchecked exception,不需要显示抛出和捕获。
2,使用例子
(1)
public void consumeAndForgetAllExceptions(){
try {
...some code that throws exceptions
} catch (Exception ex){
ex.printStacktrace();
}
}
上边的代码有什么问题么?
在回答以前让我们想想怎样才是正确的?是的,一旦程序碰到异常,它就该挂起程序而“做”点什么。那么上边的代码是这样子的么?看吧,它隐瞒了什
么?它把所有的“苦水”往肚里咽(在控制台打印出异常信息),然后一切继续,从表面上看就像什么都没有发生过一样……,很显然,上边代码达到的效果并不是
我们所期望的。
比如:通过界面删除数据时出错,没成功,但只是打印了错误日志,未做任何处理(如在界面提示),而且后面的操作还得以继续执行。
后来又怎样?
(2)
public void someMethod() throws Exception{
}
上边的代码又有什么问题?
很明显,上边的方法体是空的,它不实现任何的功能(没有一句代码),试问一个空方法体能抛出什么异常?当然Java并不阻止你这么干。最近,我也
遇到类似的情景,方法声明会抛出异常,但是代码中并没有任何“机会”来“展示”异常。当我问开发员为什么要这样做的时候,他回答我说“我知道,它确实有点
那个,但我以前就是这么干的并且它确实能为我工作。”
(3)用户登录
try {
UserManager.login(xx,xx);;
....
用户登陆以后的主事件流代码
} catch (UserNotFoundException e); {
...
用户名称没有的事件处理,例如产生一个提示用户注册的页面
} catch (PasswordNotMatchException e); {
....
密码不对的事件处理,例如forward到重新登陆的页面
}
(4)
public List getAllAccounts() throws
FileNotFoundException, SQLException{
...
}
上边的方法抛出两个异常。客户端必须显示的对这两种异常进行捕获和处理即使是在完全不知道这种异常到底是因为文件还是数据库操作引起的情况下。因此,此时的异常处理将导致一种方法和调用之间不合适的耦合。
(5)
public void dataAccessCode(){
try{
..some code that throws SQLException
}catch(SQLException ex){
ex.printStacktrace();
}
}
上边的catch块紧紧打印异常信息而没有任何的直接操作,这是情有可原的,因为对于SQLException你还奢望客户端做些什么呢?(但是显然这种就象什么事情都没发生一样的做法是不可取的)那么有没有另外一种更加可行的方法呢?
public void dataAccessCode(){
try{
..some code that throws SQLException
}catch(SQLException ex){
throw new RuntimeException(ex);
}
}
3,如何正确使用的探讨
Client's reaction when exception happens
当异常发生时客户端的响应
Exception type
异常类型
Client code cannot do anything
客户端程序(调用方)什么也不能做
Make it an unchecked exception
使用unchecked exception
Client code will take some useful recovery action based on information in exception 根据异常信息,客户端程序的某些有用的操作可能修复此异常时
Make it a checked exception 使用checked exception
此外,尽量使用unchecked exception来处理编程错误:因为unchecked
exception不用使客户端代码显示的处理它们,它们自己会在出现的地方挂起程序并打印出异常信息。Java
API中提供了丰富的unchecked excetpion,譬如:NullPointerException ,
IllegalArgumentException 和
IllegalStateException等,因此我一般使用这些标准的异常类而不愿亲自创建新的异常类,这样使代码易于理解并避免的过多的消耗内
存。
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.
分享到:
相关推荐
正确使用异常处理机制可以使程序的设计更加安全、可靠,但如果使用不当,則会让程序变得复杂难懂,从而影响程序效率。本文对 Java 异常处理方面容易出现的故障模式进行了分析、分类,并分别给出了相应的示例。 一、...
异常处理是指处理应用程序在编译时或运行...正确使用异常处理有助于防止应用程序和应用程序的使用者执行其它意外行为。 本章重点处理运行时错误的方法、异常的不同类型以及ActionScript 3.0中新的错误处理系统的优点。
Java 异常处理机制是 Java 程序设计中的一个重要方面,正确使用异常处理的策略和方法,能够确保 Java 程序结构的清晰性、易读性和健壮性。本文将详细介绍 Java 异常处理机制的应用研究,包括 Java 异常体系统结构、...
- 提供了一系列关于如何正确使用异常处理的指导原则。 - 包括设计模式、编码习惯等。 #### 十七、C++异常和Visual C++ SEH的混合使用 - **C++异常与SEH混合使用**: - 如何在C++异常处理框架与Windows下的结构化...
### 异常底层详解 #### 一、异常概念与分类 **异常**是Java编程语言中用于处理程序运行时可能出现的非预期行为的一种机制。...正确使用异常不仅可以帮助我们写出更加健壮的程序,还可以提高代码的可维护性和可读性。
理解如何在这些上下文中正确使用异常对于编写健壮的代码至关重要。 6. **异常与构造/析构函数** - 构造函数和析构函数中的异常处理需要特别注意,因为它们涉及到对象生命周期的管理。如果构造函数抛出异常,对象...
理解并正确使用异常处理机制,可以帮助程序员减少调试时间,提高软件质量,增加用户满意度。此外,在团队开发环境中,合理的异常处理策略和实践也有助于维护团队代码的一致性,降低代码维护成本,提高开发效率。
异常处理不当会导致资源泄露和程序错误,因此,正确使用异常处理机制是非常重要的。在异常处理中,应当尽量捕获具体的异常类型,避免捕获过于泛泛的异常类型,例如Exception,因为它会捕获所有类型的异常,包括检查...
8. 最佳实践:分享在实际开发中处理异常的一些最佳实践,包括避免在Controller层抛出检查异常、正确使用异常层次结构等。 通过对这些内容的深入理解,开发者可以更好地应对Spring应用中的异常情况,提高系统的健壮...
Java异常处理机制是Java编程中不可...正确使用异常处理可以有效地隔离错误,防止程序崩溃,并提供清晰的错误信息,帮助开发者定位和修复问题。在实际开发中,理解并熟练运用这些机制对于编写高质量的Java代码至关重要。
在Java编程中,异常处理...通过正确使用异常处理,开发者可以更有效地定位和解决程序中的错误,提高程序的稳定性和用户体验。同时,自定义异常允许开发者根据项目需求创建特定的异常类型,使代码更具可读性和可维护性。
Java异常处理是编程中至关重要的一个部分,它用于处理程序执行期间出现的错误和异常条件。在Java中,异常是一种特殊的对象,它们是...在编写Java程序时,理解并正确使用异常处理机制对于编写健壮、可靠的代码至关重要。
理解并正确使用异常处理机制对于编写健壮的Java应用程序至关重要。在实际编程中,应尽量遵循异常处理的最佳实践,比如避免过度使用通用异常,以及尽早发现和处理异常,以防止问题的积累和扩散。
Java异常处理是编程中至关重要的一个...理解并正确使用异常处理是每个Java程序员必备的技能。通过try-catch-finally结构,我们可以优雅地处理错误,避免程序意外终止,同时提供有用的错误信息,帮助调试和修复问题。
理解并正确使用异常处理是每个Java开发者必备的技能,它不仅是编程技术的体现,更是软件工程理念的实践。在实际开发中,合理利用异常处理,可以有效预防和管理运行时错误,构建更加稳定、高效的应用系统。
在程序中正确使用异常处理不仅可以避免程序崩溃,还可以提供给用户清晰的错误信息。当使用except语句捕获到FileNotFoundError时,应打印出有意义的错误提示信息,这有助于用户快速定位问题并找到解决办法,比如提示...
首先,我们会通过一些错误使用异常处理的案例来进行讨论,以此为基础,进而深入分析正确使用异常处理的方法。如果使用不当,异常处理不仅不能解决问题,反而可能引入新的错误和问题。而如果使用得当,则可以帮助...
对于任何错误的处理,都应该遵循一定的原则,比如不轻易捕获异常,避免掩盖程序中的bug,正确使用异常处理来管理程序的正常流程和错误流程,以及提供有意义的错误提示给用户。 在编程实践中,异常处理通常会结合...
在软件开发中,如何正确使用异常处理机制是关键。一般来说,异常应该用于表示不可恢复的错误条件,而可恢复的错误状态更适合通过返回值或错误码来处理。过度依赖异常处理可能导致程序难以理解和维护,同时增加了运行...
`TextDecoderError`是一个在数据处理过程中常见的错误,通过明确数据的实际编码格式、正确使用异常处理机制、对数据流和文件操作的深入了解以及确保代码质量,可以有效地解决这个问题。通过上述方法,不仅可以保证...