异常 - printStackTrace(Printwriter s) 方法

Exception - printStackTrace(Printwriter s) method

我想让你思考一个使用方法 printStackTrace(PrintWriter s) 的小问题。我需要在附加模式下使用它。

下面的例子解释了我的意思:

try {

    } catch (Exception e) {
        try {
            e.printStackTrace(new PrintWriter(new FileWriter("mylog.txt", true)));        
        } catch (IOException ioe) {
            System.out.println("I can't open the file mylog.txt");
        }
    }

注意

new FileWriter("mylog.txt", true);

是我在附加模式下打开文件(并第一次创建它,因为它不存在)的方式。

结果是文件中只有最后一个异常,没有一系列异常。有一次,该方法打开了一个它没有写入任何内容的文件。 我该如何解决这个问题?

谢谢。

您应该关闭创建的 Writers,不关闭它可能会导致您描述的问题。

try (PrintWriter writer = new PrintWriter(new FileWriter("mylog.txt", true))) {
    e.printStackTrace(writer);
}

添加 krzyk 提到的内容

Per OutputStreamWriter.close() :关闭流,首先刷新它。流关闭后,进一步的 write() 或 flush() 调用将导致抛出 IOException。关闭之前关闭的流没有任何效果。

如前所述,如果您不调用 close 并且此 try{}catch 被频繁触发,则您不会将内容刷新到文件。

应该这样写

try {

} catch (Exception e) {
    try {
        FileWriter fw = new FileWriter("mylog.txt", true)
        e.printStackTrace(new PrintWriter(fw));
        fw.close();
    } catch (IOException ioe) {
        System.out.println("I can't open the file mylog.txt");
    }
}

更好的方法是

FileWriter fw = new FileWriter("mylog.txt", true);
PrintWriter pw = new PrintWriter(fw);
try {

} catch (Exception e) {
    try {
        e.printStackTrace(pw);
    } catch (IOException ioe) {
        System.out.println("I can't open the file mylog.txt");
    }
}finally {
     pw.close();
     fw.close();
}