Java Nested Exception Handling
我遇到了一个读取文本文件并对其进行分析的代码库。 我对使用异常的方式感到困惑。 单独的类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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; } } |
//------------------------------------------------------------------
1 2 3 4 5 6 7 8 9 |
从基础异常类中派生自己的异常是一个非常好的主意
1)您可以单独处理不同的异常对象。
2)函数通常有"throws ..."后缀,告诉调用者期望的异常。这有助于程序稳定性。
请记住,java具有多包异常语法:
Catch(exception1 | exception2 | ... e)其中e是捕获的对象。如果要等效处理此类异常类型,请使用此选项。
首先,
调用方法时,创建自己的异常类可能很有用;所以你可以做点什么
1 2 3 4 5 6 7 8 9 10 11 | 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. } } |
也就是说,这里的系统有点奇怪。通过在
Java中已检查和未检查的异常系统是实验性的,但大多数程序员认为这不是一个好的概念。此外,已检查的异常层次结构设计不当,例如,如果使用反射执行某些操作,则必须捕获4或5个单独的异常。
在实践中,现代Web应用程序中的几乎每个bean代码都会调用一些使用IO,SQL(可能还有反射)的函数,因此使用已检查的异常系统,您需要处理或添加到函数签名中的许多异常。
例如,在Spring中提出的Java编程模型是透明地处理异常。您有一个服务接口,实现可以使用WebService,SQL数据库或其他任何东西。你怎么知道要处理的异常以及如何处理?因此,您提供自己的异常层次结构,可以在单个位置处理。
Spring还包含
您还可以处理方面或过滤器中的异常。在这种情况下,例外应该对您的业务代码完全透明。您将完全异常处理与正常处理分开。