科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Three Rules for Effective Exception Handling(中文)

Three Rules for Effective Exception Handling(中文)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

有经验的开发人员都知道调试程序最难的部分不是修改Bug,而是找出Bug的藏身之处。通过使用上面所讲的三个原则,你就可以使异常帮助你追踪和清除Bugs并且使得你程序更加健壮和友好。

作者:Leon_He 来源:CSDN 2008年2月28日

关键字: Exception Three Rules java

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共3页)

额外的编写多个Catch块,在某些情况下,可能是多余的负担,但是在这个例子中,它确实可以使程序以一种更加友好的方式回应程序发生的各种错误。
 
如果是IOException而不是我们起初所指定的那三个异常被抛出了,那么最后一个Catch块将处理并提供一个一般意义上的错误信息。这样,程序在提供某些具体的错误信息的同时也可以对意想不到的那些与文件有关的异常提供一般意义上的处理。
 
有时候,开发人员直接捕获Exception,然后显示异常类的名字和Stack Trace信息,但为了具体问题具体处理,请不要这样做。看到屏幕上的java.io.EOFException或者Stack Trace信息可能会使用户迷惑,而不是帮助他。捕获具体的异常从而用英语或其它语言给用户一个与问题相关提示,同时将异常的Stack Trace放到LOG文件中。异常和Stack Trace对开发人员意味着一个有力的调试工具,而对用户却毫无用处。
 
最后,请注意到Jcheckbook将捕获和处理Exception类型异常推迟到用户界面上,而不是放到readPreferences()函数里。这样在界面上可以以对话框的形式提示的用户相关信息或者使用其它的处理方式。这就是我们待会儿将会讨论的“晚捕获”原则
 
Translator comments:
所谓具体化为:
定义具体的代表某个特定错误的异常类。
方法声明特定的异常类。
方法捕获具体类。
目地:具体问题具体处理。
 
早抛出
通过Stack trace向我们展示的引起异常的方法调用顺序、类名、方法名、原代码文件名以及每个方法调用的行号,这样可以帮助我们精确地定位异常发生的地方。考虑下面的Stack trace信息:
 
java.lang.NullPointerException
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:103)
at jcheckbook.JCheckbook.readPreferences(JCheckbook.java:225)
at jcheckbook.JCheckbook.startup(JCheckbook.java:116)
at jcheckbook.JCheckbook.<init>(JCheckbook.java:27)
at jcheckbook.JCheckbook.main(JCheckbook.java:318)

这表明类FileInputStream的open方法抛出一个NullPointerException异常,但注意到 FileInputStream.open()是JAVA标准类库的一部分。这样引起异常的原因很可能在我们自己代码里面,而不JAVA API,所以问题一定出在这之前的某个方法内,幸运的是它被显示了出来。

很不幸,异常NullPointerException恰好是JAVA中能提供有效信息最少的异常类中的一个。它并不能告诉我们真正想知道的。同时我们也需要向后追踪去找到错误发生地。
 
通过向后追踪Stack trace和检查我们的代码,我们发现错误是由于调用方法readPreferences()时传入的文件名为null,因为方法知道一个空文件名将使方法不能再执行下去,所以它立即检查这个条件:
 
public void readPreferences(String filename)
    throws IllegalArgumentException
{
    if (filename == null)
    {
        throw new IllegalArgumentException
                            ("filename is null");
    } //if
   
    //...perform other operations...
   
    InputStream in = new FileInputStream(filename);
   
    //...read the preferences file...
}
 
因为比较早的抛出了异常,所以异常就变得更加具体和准确了。Stack trace也很准确地反映出发生了什么异常,为什么及在什么地方。这样使得Stack trace更加准确的反映了本来程序所发生的一切:
 
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)
 
另外,异常信息(“filename is null”)指出了是什么为空,从而使得异常附带更多有用的信息。而这些是我们无法从异常NullPointerException中获得的。
 
一旦出错误就立即抛出异常,这样可以避免再去构造或找开那些不再需要的对象或资源。比如说文件或网络连接。与打开这些资源相关的清理工作也可以避免了。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章