java - 如何获取java中抛出的IOException的文件名?

标签 java ioexception

我有一个 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

另请参阅 Exception-Handling Antipatterns .

关于java - 如何获取java中抛出的IOException的文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25375647/

相关文章:

java - 如果我想中继移动应用游戏的数据,最好的方法是什么?

Android Error : java. io.IOException : CreateProcess error=2, 系统找不到指定的文件

java - 类在我的包中不是公共(public)的,无法从外部包访问

java - 相当于 BitSet 的 list.size() 是什么?

Android Studio Gradle 构建错误 java.io.IOException Could not delete path

尝试从可运行的 jar 文件加载图像文件时出现 javax.imageio.IIOException

Java OutputStream.write() 抛出错误的文件描述符,但刷新有效

Java Resource InputStream 正在关闭?

java - LibGDX 不断给我这个错误 : "ERROR BAD LOGIC GAMES", 我该如何解决这个问题?

java - 如何在 JAVA 中为单个 XML 元素编写默认命名空间和带有前缀的命名空间