java 多层异常_Java嵌套异常处理

我遇到了一个读取文本文件并对其进行分析的代码库。 我对使用异常的方式感到困惑。 单独的类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);

}

}

从基础异常类中派生自己的异常是一个非常好的主意

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

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

请记住,java具有多包异常语法:

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

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

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

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

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

Spring还包含NestedRuntimeException中的所有异常。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值