gpt4 book ai didi

java - 何时捕获异常(高级别与低级别)?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:41:58 29 4
gpt4 key购买 nike

我创建了以下类:

  • 抽象记录器类
  • 实现实际记录器的抽象记录器类的三个子类
  • 充当记录器接口(interface)的类

三个子类都可以抛出异常(创建文件、写入文件等)。

是直接在三个子类中捕获异常,还是重新扔到那里,在接口(interface)中捕获?还是捕获一个使用记录器接口(interface)的类?

其次,我有一个解析设置文件的类。我用单例模式实现了它(运行时只有一个实例)。当然,在此类中可能会出现异常(NullPointerException 和 IOException)。

我应该直接在这个类中捕获这些异常还是将其重新抛给那个类的客户端?

我的一般问题是我不知道什么时候必须捕获异常以及什么时候重新抛出它。

最佳答案

Liskov substitution principle 的一部分状态:

No new exceptions should be thrown by methods of the subtype, except where those exceptions are themselves subtypes of exceptions thrown by the methods of the supertype.

当在客户端代码中用一种类型替换另一种类型时,任何异常处理代码都应该仍然有效。

如果您选择使用checked exceptions , Java 为您强制执行此操作。 (这不是建议使用检查异常,但我会在这里使用来演示原理)。

这并不是说您应该捕获所有异常并进行转换。异常可能是意外的(即检查异常环境中的 RuntimeExceptions),您应该只翻译匹配的异常。

例子:

public class NotFoundException {
}

public interface Loader {
string load() throws NotFoundException;
}

用法:

public void clientCode(Loader loader) {
try{
string s = loader.load();
catch (NotFoundException ex){
// handle it
}
}

这是一个很好的实现,它捕获了一个有意义的捕获和翻译异常,并传播其余部分。

public class FileLoader implements Loader {
public string load() throws NotFoundException {
try{
return readAll(file);
} catch (FileNotFoundException ex) {
throw new NotFoundException(); // OK to translate this specific exception
} catch (IOException ex) {
// catch other exception types we need to and that our interface does not
// support and wrap in runtime exception
throw new RuntimeException(ex);
}
}
}

这是翻译所有异常的错误代码,不需要满足 Liskov:

public class FileLoader implements Loader {
public string load() throws NotFoundException {
try{
return readAll(file);
} catch (Exception ex) {
throw new NotFoundException(); //assuming it's file not found is not good
}
}
}

关于java - 何时捕获异常(高级别与低级别)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35178418/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com