2013-05-19 176 views
1

我遇到了一个读取文本文件并分析它的代码库。我对使用例外的方式感到困惑。一个单独的类AppFileReaderExceptionextends异常已定义,其中扩展类仅返回异常的错误消息。此外,功能getSymbol()同时使用throwstry and catch blockerror()函数也有一个异常处理程序,可能会导致嵌套异常!在基本尝试和捕获应该足够的情况下进行这种异常处理是否有优势?是否有任何理由扩展异常类,结合throwstry-catch块?这些过度杀手还是有充分理由拥有这样的结构?Java嵌套异常处理

package AppName;  
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.LineNumberReader; 

public class AppFileReader { 


    // 
    public char getSymbol() throws AppFileReaderException { 
     try { 

     //do something 

     } catch (Exception e) { 
      error("IO Error: " + fileName + "@" + currentLineNumber); 
     } 
     return somechar; 
    } 


    public void error(String errorMsg) throws AppFileReaderException { 
     throw new AppFileReaderException(errorMsg); 
    } 

    public AppFileReader(String fileName) throws FileNotFoundException { 
     reader = new LineNumberReader(new FileReader(fileName)); 
     this.fileName = fileName; 
    } 

} 

// ----------------------------------------- -------------------------

AppFileReaderException扩展类如下:

package AppName; 
public class AppFileReaderException extends Exception { 


    public AppFileReaderException(String msg) 
    { 
     super(msg); 
    } 
} 

回答

2

首先,error()方法(不是功能!)没有任何处理。它只是抛出给定消息的异常。

创建您自己的异常类在调用方法时可能很有用;所以你可以做类似

public void methodThatCallsLibrary() { 
    try { 
     doSomething(); 
     new AppFileReader().getSymbol(); 
     doOtherSomething(); 
    } catch (AppFileReaderException afre) { 
    // handling specific to appFileReader 
    } catch (Exception e) { 
     // handling related to the rest of the code. 
    } 
} 

这就是说,这里的系统是一个小奇怪。通过在error()方法中创建异常,异常的堆栈跟踪对于引发异常的所有可能位置都是相同的。此外,它看起来只是屏蔽了IOException,所以我可能会去转发IOException本身(如果没有,最后抛出的异常中包含嵌套异常,以提供更好的调试信息)。

0

Java中的checked和unchecked exceptions的系统是实验性的,但大多数程序员认为这不是一个好的概念。此外,检查的异常层次结构设计不好,例如,如果您使用反射进行操作,则必须捕获4个或5个单独的异常。

实际上,现代Web应用程序中的几乎每个bean代码都会调用一些函数来处理IO,SQL(可能是反射),所以使用检查的异常系统时,您会有很多异常来处理或添加到功能签名。

Java的编程模型,例如在Spring中提出的,就是透明地处理异常。你有一个服务接口,实现可以使用WebService,SQL数据库或其他任何东西。你怎么知道要处理什么异常?因此,您提供了您可以在单个地方处理的自己的异常层次结构。

Spring也将所有异常包装在NestedRuntimeException中。

您还可以处理方面的例外过滤器。在这种情况下,异常应该对您的业务代码完全透明。您将完全异常处理与正常处理分开。

2

从基本异常类派生自己的异常是一个非常好的主意,因为

1)你可以处理不同的异常单独的对象。

2)函数通常会在后面添加“throws ...”,这会告诉调用方有什么异常情况。这有助于程序的稳定。

记住,Java有一个multicatch异常语法:

捕捉(exception1 | exception2 | ... E),其中e是抓住了对象。如果你想等价地处理这种异常类型,请使用它。