1

我遇到了一个读取文本文件并对其进行分析的代码库。我对使用异常的方式有点困惑。已定义了一个单独的异常类AppFileReaderException,其中扩展类仅返回异常的错误消息。extends此外,该函数getSymbol()同时使用throwstry and catch block。该error()函数也有一个异常处理程序,可能会导致嵌套异常!在基本的 try 和 catch 就足够的情况下,进行这种异常处理有什么好处吗?是否有任何理由扩展异常类,将两者结合起来throwstry-catch阻塞?这些是过度杀戮还是有充分的理由拥有这样的构造?

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);
    }
}
4

3 回答 3

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 本身(如果没有,在最终抛出的异常中包含嵌套异常,以提供更好的调试信息)。

于 2013-05-19T10:49:27.480 回答
2

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

1)您可以分别处理不同的异常对象。

2) 函数通常有“throws ...”后缀,告诉调用者期望什么异常。这有助于程序稳定性。

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

Catch (exception1 | exception2 | ... e) 其中 e 是被捕获的对象。如果您想等效地处理此类异常类型,请使用此选项。

于 2013-05-19T10:52:13.943 回答
0

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

在实践中,几乎现代 Web 应用程序中的每个 bean 代码都会调用一些函数,这些函数对 IO、SQL(可能还有反射)执行某些操作,因此使用检查异常系统,您将有很多异常需要处理或添加到函数签名中。

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

Spring 还将所有异常包装在NestedRuntimeException.

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

于 2013-05-19T10:50:41.830 回答