我有一个 try block ,它可以处理相当多的文件打开/关闭/读取/写入(多个文件)。
看起来像:
try {
// commands
}
catch (IOException e) {
System.err.println("Error: " + e);
}
主要问题是,如果出现错误,e.toString() 不包含有关引发异常的文件名的信息。
我可以分别检查每个读/写/打开/关闭操作,然后知道哪个文件发生错误,但这似乎违背了优雅的 try-catch 结构的目的。
还有别的出路吗?我只是希望能够打印 e 在 try block 中出错的文件名。
编辑:也许我应该弄清楚这个问题是在哪种情况下出现的。当我解析命令行参数、输入/输出文件等时,会发生这种情况。我将文件名传递给可能返回 IO 错误的各种函数和方法。要求我通过打印错误和有该错误的文件名来处理任何文件问题的通用方法似乎是合理的。我知道 IOException 比使用文件处理 IO 更广泛,但考虑到 IOException 是一个专门的异常类,拥有一个返回发生错误的 IO 源的方法肯定是有意义的。
最佳答案
您不知道 - 如您所知,IOException
没有有关生成异常的 File
的信息。它的目的太笼统了。如果您自己推出,则可以捕获相关信息并捕获您自己的异常。
在处理输入的各种方法中,将相关部分包装在 try/catch block 中,捕获 IOException,并抛出您自己的附加数据。
这是一个完整的程序,演示了基本思想。
class FooException extends Exception {
private static final long serialVersionUID = 2816777468035627105L;
private final String filename;
private final Throwable cause;
public FooException(String filename) {
this(filename, null);
}
public FooException(String filename, Throwable cause) {
this.filename = filename;
this.cause = cause;
}
@Override
public String getMessage() {
return "Error reading file";
}
@Override
public Throwable getCause() {
return cause;
}
public String getFilename() {
return filename;
}
}
public class Soj25375647 {
public static void main(String[] args) {
try {
throwsAnException();
// Do other things that might throw my exception
} catch (FooException e) {
System.err.printf("File: %s, error: %s, caused by %s%n", e.getFilename(), e, e.getCause());
}
}
public static void throwsAnException() throws FooException {
try {
int x = 2 / 0;
} catch (ArithmeticException e) {
throw new FooException("bob.file", e);
}
}
}
输出
File: bob.file, error: soj25375647.FooException: Error reading file, caused by java.lang.ArithmeticException: / by zero
关于java - 如何获取java中抛出的IOException的文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25375647/