`
lovesunshine
  • 浏览: 16097 次
  • 性别: Icon_minigender_1
  • 来自: 世外桃源
文章分类
社区版块
存档分类
最新评论

正确使用异常

阅读更多

最近发现做过的系统,对异常没有很好的处理,看了些资料,整理如下:

 

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异常故障模式分析.pdf

    正确使用异常处理机制可以使程序的设计更加安全、可靠,但如果使用不当,則会让程序变得复杂难懂,从而影响程序效率。本文对 Java 异常处理方面容易出现的故障模式进行了分析、分类,并分别给出了相应的示例。 一、...

    Flex as3 的异常处理

    异常处理是指处理应用程序在编译时或运行...正确使用异常处理有助于防止应用程序和应用程序的使用者执行其它意外行为。 本章重点处理运行时错误的方法、异常的不同类型以及ActionScript 3.0中新的错误处理系统的优点。

    Java异常处理机制应用研究.pdf

    Java 异常处理机制是 Java 程序设计中的一个重要方面,正确使用异常处理的策略和方法,能够确保 Java 程序结构的清晰性、易读性和健壮性。本文将详细介绍 Java 异常处理机制的应用研究,包括 Java 异常体系统结构、...

    异常底层详解

    ### 异常底层详解 #### 一、异常概念与分类 **异常**是Java编程语言中用于处理程序运行时可能出现的非预期行为的一种机制。...正确使用异常不仅可以帮助我们写出更加健壮的程序,还可以提高代码的可维护性和可读性。

    C++异常处理的编程方法

    理解如何在这些上下文中正确使用异常对于编写健壮的代码至关重要。 6. **异常与构造/析构函数** - 构造函数和析构函数中的异常处理需要特别注意,因为它们涉及到对象生命周期的管理。如果构造函数抛出异常,对象...

    【ASP.NET编程知识】.net core异常中间件的使用.docx

    ASP.NET Core异常中间件是框架提供的一种处理程序执行过程中出现异常的机制,它可以在应用程序的管道中捕获并处理这些异常,确保应用的稳定性...理解并正确使用异常中间件是构建健壮的ASP.NET Core应用的关键步骤之一。

    异常处理的优劣观,异常处理

    正确使用异常处理不仅可以增强程序的健壮性,还能提高代码的可读性和可维护性。然而,不当的使用也会引入不必要的复杂性和性能损耗。因此,在实际开发中需要根据具体情况进行权衡,合理设计异常处理逻辑。

    pring异常处理共5页.pdf.zip

    8. 最佳实践:分享在实际开发中处理异常的一些最佳实践,包括避免在Controller层抛出检查异常、正确使用异常层次结构等。 通过对这些内容的深入理解,开发者可以更好地应对Spring应用中的异常情况,提高系统的健壮...

    深入理解java异常处理机制Java开发Java经验技巧共

    Java异常处理机制是Java编程中不可...正确使用异常处理可以有效地隔离错误,防止程序崩溃,并提供清晰的错误信息,帮助开发者定位和修复问题。在实际开发中,理解并熟练运用这些机制对于编写高质量的Java代码至关重要。

    java学习笔记——异常

    异常处理是Java编程的重要组成部分,理解并正确使用异常处理机制能帮助我们编写更加健壮、易于维护的代码。通过合理的异常处理,可以提高程序的稳定性和用户体验。在实际开发中,应当根据具体情况选择合适的异常处理...

    05_第5章 异常1

    在Java编程中,异常处理...通过正确使用异常处理,开发者可以更有效地定位和解决程序中的错误,提高程序的稳定性和用户体验。同时,自定义异常允许开发者根据项目需求创建特定的异常类型,使代码更具可读性和可维护性。

    Java程序设计-6-异常.ppt

    Java异常处理是编程中至关重要的一个部分,它用于处理程序执行期间出现的错误和异常条件。在Java中,异常是一种特殊的对象,它们是...在编写Java程序时,理解并正确使用异常处理机制对于编写健壮、可靠的代码至关重要。

    Java程序开发教学课件:08-异常.ppt

    理解并正确使用异常处理机制对于编写健壮的Java应用程序至关重要。在实际编程中,应尽量遵循异常处理的最佳实践,比如避免过度使用通用异常,以及尽早发现和处理异常,以防止问题的积累和扩散。

    Python技术如何进行异常处理.docx

    Python 语言中的异常处理是编程实践中不可或缺的一部分,它允许开发者优雅地处理可能出现的...通过正确使用异常处理,开发者可以更好地控制程序的行为,确保即使在出现错误的情况下,程序也能尽可能地按照预期执行。

    Java程序开发教学课件:08异常.pptx

    Java异常处理是编程中至关重要的一个...理解并正确使用异常处理是每个Java程序员必备的技能。通过try-catch-finally结构,我们可以优雅地处理错误,避免程序意外终止,同时提供有用的错误信息,帮助调试和修复问题。

    Java 异常处理练习.doc

    Java异常处理是编程中至关重要的一个方面,它用于处理程序执行期间可能出现的错误或异常状况。在Java中,异常是一个对象,它表示程序...在编写Java代码时,理解并正确使用异常处理机制是确保程序健壮性和稳定性的关键。

    Java异常与错误处理中英文翻译

    理解并正确使用异常处理是每个Java开发者必备的技能,它不仅是编程技术的体现,更是软件工程理念的实践。在实际开发中,合理利用异常处理,可以有效预防和管理运行时错误,构建更加稳定、高效的应用系统。

    java 异常处理

    在Java编程中,异常处理是一项至关重要的技能,它关乎到程序的健壮...理解并正确使用异常处理,结合适当的错误预防策略,是每个Java开发者必备的技能。同时,考虑国际化因素,如使用`Locale`,可以使程序更具有普适性。

    Coding in Delphi(前面8章已经翻译)

    首先,我们会通过一些错误使用异常处理的案例来进行讨论,以此为基础,进而深入分析正确使用异常处理的方法。如果使用不当,异常处理不仅不能解决问题,反而可能引入新的错误和问题。而如果使用得当,则可以帮助...

Global site tag (gtag.js) - Google Analytics