我遇到了一个读取文本文件并对其进行分析的代码库。我对使用异常的方式感到困惑。单独的类AppFileReaderException
已定义extends
个异常,其中扩展类仅返回异常的错误消息。此外,函数getSymbol()
同时使用throws
和try and catch block
。 error()
函数也有一个异常处理程序,可能导致嵌套异常!在基本的try和catch应该足够的情况下进行这种异常处理有什么好处吗?是否有任何理由扩展异常类,同时结合throws
和try-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);
}
}
答案 0 :(得分: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本身(如果没有,在最终抛出的异常中包含嵌套异常,以提供更好的调试信息)。
答案 1 :(得分:2)
从
开始,从基本异常类中派生自己的异常是个好主意1)您可以单独处理不同的异常对象。
2)函数通常有“throws ...”后缀,告诉调用者期望的异常。这有助于程序的稳定性。
请记住,java具有多包异常语法:
Catch(exception1 | exception2 | ... e)其中e是捕获的对象。如果要等效处理此类异常类型,请使用此选项。
答案 2 :(得分:0)
Java中已检查和未检查的异常系统是实验性的,但大多数程序员认为这不是一个好的概念。此外,已检查的异常层次结构设计不当,例如,如果使用反射执行某些操作,则必须捕获4或5个单独的异常。
实际上,现代Web应用程序中的几乎所有bean代码都会调用一些使用IO,SQL(可能还有反射)的函数,因此使用已检查的异常系统,您需要处理或添加许多异常函数签名。
例如,在Spring中提出的Java编程模型是透明地处理异常。您有一个服务接口,实现可以使用WebService,SQL数据库或其他任何东西。你怎么知道要处理的异常以及如何处理?因此,您可以在单个位置提供自己的异常层次结构。
Spring还会在NestedRuntimeException
中包含所有异常。
您还可以处理方面或过滤器中的例外情况。在这种情况下,例外应该对您的业务代码完全透明。您将完全异常处理与正常处理分开。