总结-java异常处理

异常处理

前言:识别错误,响应错误的一种机制,有效的异常处理能够加强程序的健壮性,易于调试。

异常是一种强大的调试手段,在于回答了以下三个问题:
1,什么出错了?
2,那里出错了?
3,为什么出错?

在有效使用异常的情况下,异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出,如果你的异常没有回答以上全部问题,那么可能你没有很好地使用它们。

有三个原则可以帮助你在调试过程中最大限度地使用好异常,这三个原则是:
1,具体明确
2,提早抛出
3,延时捕获

实例说明:

具体明确:
 捕获异常时尽量明确也很重要。Java让明确捕获异常变得容易,因为我们可以对同一try块定义多个catch块,从而对每种异常分别进行恰当的处理。
  如: File prefsFile = new File(prefsFilename);

        try{
            readPreferences(prefsFile);
        }
        catch (FileNotFoundException e){
            // alert the user that the specified file
            // does not exist
        }
        catch (EOFException e){
            // alert the user that the end of the file
            // was reached
        }
        catch (ObjectStreamException e){
             // alert the user that the file is corrupted
        }
        catch (IOException e){
            // alert the user that some other I/O
            // error occurred
        }

PS:
1,JCheckbook 通过使用多个catch块来给用户提供捕获到异常的明确信息。举例来说:如果捕获了FileNotFoundException,它可以提示用户指定另一 个文件,某些情况下多个catch块带来的额外编码工作量可能是非必要的负担,但在这个例子中,额外的代码的确帮助程序提供了对用户更友好的响应。
2,有 时开发人员会捕获范化异常,并显示异常类名称或者打印堆栈信息以求"具体"。千万别这么干!用户看到java.io.EOFException或者堆栈信息 只会头疼而不是获得帮助。应当捕获具体的异常并且用"人话"给用户提示确切的信息。不过,异常堆栈倒是可以在你的日志文件里打印。记住,异常和堆栈信息是用来帮助开发人 员而不是用户的。

提早抛出/迅速失败:
通过在检测到错误时立刻抛出异常来实现迅速失败,可以有效避免不必要的对象构造或资源占用,比如文件或网络连接。同样,打开这些资源所带来的清理操作也可以省却。

  如: public void readPreferences(String filename)
            throws IllegalArgumentException{
                if (filename == null){
                     throw new IllegalArgumentException("filename is null");
                }  

               InputStream in = new FileInputStream(filename);
            }
通过提早抛出异常(又称"迅速失败"),异常得以清晰又准确。堆栈信息立即反映出什么出了错(提供了非法参数值),为什么出错(文件名不能为空值),以及哪里出的错(readPreferences()的前部分)。这样我们的堆栈信息就能如实提供:
    java.lang.IllegalArgumentException: filename is null
        at jcheckbook.JCheckbook.readPreferences(JCheckbook.java:207)
        at jcheckbook.JCheckbook.startup(JCheckbook.java:116)
        at jcheckbook.JCheckbook.<init>(JCheckbook.java:27)
        at jcheckbook.JCheckbook.main(JCheckbook.java:318)

延迟捕获
在有条件处理异常之前过早捕获它,通常会导致更严重的错误和其他异常。

    如:public void readPreferences(String filename){
           InputStream in = null;
        try{
            in = new FileInputStream(filename);
        }
        catch (FileNotFoundException e){
            logger.log(e);
        }

        in.read(...);
        }

PS:
1.上 面的代码在完全没有能力从FileNotFoundException中恢复过来的情况下就捕获了它。
2.把异常处理的责任往调用链的上游传递的办法,就是在方法的throws子句声明异常。在声明可能抛出的异常时,注意越具体越好。

总结技巧:
1,技巧是在合适的层面捕获异常,以便你的程序要么可以从异常中有意义地恢复并继续下去,而不导致更 深入的错误;要么能够为用户提供明确的信息,包括引导他们从错误中恢复过来。如果你的方法无法胜任,那么就不要处理异常,把它留到后面捕获和在恰当的层面处理。
2,System.out.println是高代价的。调用System.out.println会降低系统吞吐量。(用log日志记录)
3,在生产环境中别用异常的printStackTrace()方法。printStackTrace默认会把调用的堆栈打印到控制台上,在生产环境中访问控制台是不现实的。

异常处理的基本原则:
1,如果你不能处理异常,不要捕获该异常。
2,如果要捕获,应在离异常源近的地方捕获它。(提早抛出)
3,不要吞没异常,什么都不做。
4,绝对不要因为写throws语句会让你用起来不舒服,而不声明需要检查的异常。

参考大牛博客总结出来的,希望各位多多指教,引用出处:http://www.importnew.com/1701.html

猜你喜欢

转载自blog.csdn.net/fragrant_no1/article/details/78318463