【发布时间】:2017-10-31 11:48:33
【问题描述】:
我有一个 try 块,它可以处理很多文件打开/关闭/读取/写入(多个文件)。
看起来像:
try {
// commands
}
catch (IOException e) {
System.err.println("Error: " + e);
}
主要问题是,如果出现错误,e.toString() 不包含有关引发异常的文件名的信息。
我可以分别检查每个读/写/打开/关闭操作,然后知道错误发生在哪个文件上,但这似乎违背了拥有优雅的 try-catch 结构的目的。
还有其他出路吗?我只是希望能够打印在 try 块中 e 出错的文件名。
编辑:也许我应该明确在哪种情况下会出现此问题。当我解析命令行参数、输入/输出文件等时会发生这种情况。我将文件名传递给可能返回 IO 错误的各种函数和方法。要求我通过打印错误和具有该错误的文件名来处理任何文件问题的通用方法似乎是合理的。我知道 IOException 比使用文件处理 IO 更广泛,但考虑到 IOException 是一个专门的异常类,拥有一个返回发生错误的 IO 源的方法肯定是有意义的。
【问题讨论】:
-
你肯定有
File范围内的对象。 -
将每个操作隔离在它自己的 try-catch 块中,而不是尝试使用单个 catch all
-
@MadProgrammer 这听起来更像是问题而不是解决方案。如果有一个单一的包罗万象,它可能会使原始的
File对象仍在范围内。我希望你的意思是嵌套 try-catch,否则你刚刚推荐了一个反模式。 -
@EJP 从问题的声音来看,他们有多个文件被读取和写入 - 但我可能是错的 - 我更喜欢尽可能隔离责任,因为它更容易识别问题并处理它。它们是否嵌套取决于要求,但通常是的......
-
也许他们让用户选择文件,并且它们处于一个合理的数据结构中,只是碰巧很难读取。例如,一棵树:IOException 可能来自一个文件,但您看到的只是它的祖父目录。
标签: java ioexception