gpt4 book ai didi

java - 准确查明错误和异常的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-02 03:38:46 25 4
gpt4 key购买 nike

我已经阅读了很多有关异常的内容,但我很难将它们拼凑在一起......我正在尝试编写一个用于读取文件的实用方法(这是为了练习,所以我不感兴趣)使用库):

public static List<String> readFile(String file)
throws NoSuchFileException,
AccessDeniedException,
SomeException1,
SomeException2,
IOException {
Path p = Paths.get(file);
if (!Files.exists(p)) {
throw new NoSuchFileException(file);
} else if (!Files.isRegularFile(p)) {
throw new SomeException1(file);
} else if (!Files.isReadable(p)) {
throw new AccessDeniedException(file);
} else if (Files.size(p) == 0) {
throw new SomeException2(file);
}
return Files.readAllLines(p);
}


public static void main(String[] args) {
try {
if (args.length != 2) {
System.out.println("The proper use is: java MyProgram file1.txt file2.txt");
return;
}

List<List<String>> files = new ArrayList<>();
for (int i = 0; i < args.length; i++) {
try {
files.add(Utilities.readFile(args[i]));
} catch (NoSuchFileException e) {
System.out.printf("File %s does not exist%n", e.getMessage());
System.exit(-1);
} catch (SomeException1 e) {
System.out.printf("File %s is not a regular file%n", e.getMessage());
throw e;
} catch (AccessDeniedException e) {
System.out.printf(
"Access rights are insufficient to read file %s%n", e.getMessage()
);
throw new AccessDeniedException(e);
} catch (SomeException2 e) {
System.out.printf("File %s is empty%n", e.getMessage());
throw new SomeOtherException(e);
}
}
} catch (Exception e) {
e.printStackTrace();
}

我想抛出精确的异常,以便稍后捕获它们并为用户编写相关的错误消息,但这看起来很糟糕......有更好的方法吗?

我看到了几个问题,以下是我的想法:

  1. 我很确定这是一个异常(exception)情况,而不是流量控制,所以我应该使用异常(exception)。
  2. 我无法抛出一般异常,否则我将无法查明错误原因。
  3. 另一方面,这感觉像是太多异常,从而污染了方法签名。另外,我不能使用未经检查的异常,因为这些不是程序员错误,可以处理它们。
  4. 而且我找不到对于我的用例来说足够精确的标准异常。
  5. 但我不确定现在是否是创建自定义类型异常的正确时机,或者这是否是解决问题的错误方法...

最佳答案

如果您的异常全部派生自公共(public)基本异常,例如 IOException,则为基本异常添加 throws 声明就足够了:

public static List<String> readFile(String file)
throws IOException {
// ...
}

如果您不想为所有情况创建不同的异常,请使用每个异常附加的消息:

public static List<String> readFile(String file)
throws IOException {
Path p = Paths.get(file);
if (!Files.exists(p)) {
throw new IOException( "No such file: " + file);
} else if (!Files.isRegularFile(p)) {
throw new IOException( "No regular file: " + file);
} else if (!Files.isReadable(p)) {
throw new IOException( "Access denied: " + file);
} else if (Files.size(p) == 0) {
throw new IOException( "Empty file: " + file);
}
return Files.readAllLines(p);
}

如果错误处理所需要做的只是打印错误消息,那么这是一个不错的选择。

关于java - 准确查明错误和异常的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37104397/

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