Запись исключений в файл

Проект java, который я создал, должен быть проверен на 1800 случаев, и выход каждого случая должен совпадать с золотым (желаемым) выходом. Для этого я создал perl script и запускал его на cygwin.

Есть несколько случаев, которые вызывают исключения, но ошибочно считаются правильными. Я хочу добавить блок catch try в java-код, чтобы, если какое-либо исключение выбрано, оно поймано, а трассировка стека будет напечатана в файле exception.txt.

Pseudo Java code:
main()
{
    try
    {
       ... //complete code of main()
    }
    catch (Exception e)
    {
         FileWriter fstream=new FileWriter("exception.txt");
         BufferedWriter out=new BufferedWriter(fstream);
         out.write(e.toString());
         out.close();
    }
}

Но это перезаписывает предыдущее содержимое файла и, наконец, файл содержит последнее исключенное исключение. Как я могу написать блок catch так, чтобы был напечатан файл stackTrace, и содержимое файла не повреждено и не перезаписывается каждый раз.

Ответ 1

Вместо этого используйте этот конструктор:

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

Здесь описывается .

РЕДАКТИРОВАТЬ: согласно комментарию Джона ниже:

Если вы хотите распечатать всю трассировку стека, используйте printStackTrace:

fw = new FileWriter ("exception.txt", true);
pw = new PrintWriter (fw);
e.printStackTrace (pw);

Кроме того, после этого используйте соответствующие вызовы close.

Ответ 2

Вы можете использовать:

FileOutputStream fos = new FileOutputStream(new File("exception.txt"), true);  
PrintStream ps = new PrintStream(fos);  
e.printstacktrace(ps);

Ответ 3

Использование

FileWriter fstream=new FileWriter("exception.txt", true);

чтобы создать записывающий файл.

Ответ 4

Вот программа, которая демонстрирует, что я думаю вам нужно:


import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.PrintWriter;

public class StrackTraceAppender {

   public static void main(String[] args) {
      try {
         thrower("Oh noes!");
      } catch (Exception e) {
         appendToFile(e);
      }

      try {
         thrower("I died!");
      } catch (Exception e) {
         appendToFile(e);
      }
   }

   public static void thrower(String message) throws Exception {
      throw new RuntimeException(message);
   }

   public static void appendToFile(Exception e) {
      try {
         FileWriter fstream = new FileWriter("exception.txt", true);
         BufferedWriter out = new BufferedWriter(fstream);
         PrintWriter pWriter = new PrintWriter(out, true);
         e.printStackTrace(pWriter);
      }
      catch (Exception ie) {
         throw new RuntimeException("Could not write Exception to file", ie);
      }
   }
}

Он использует метод printStackTrace(PrintWriter) для Throwable для печати всей трассировки стека до конца файла с именем "exception.txt", затем существует метод main(), который демонстрирует использование с двумя исключениями выборки. Если вы запустите его в своей среде IDE, вы должны обнаружить, что вы получили файл с двумя написанными на нем стеками стека (работает для меня).

Ответ 5

Попробуйте следующее:

PrintStream printStream = new PrintStream(new File("exception.txt"));
try {   
     //error proven code
} catch (Exception exception) {
     exception.printStackTrace(printStream);
}

Ответ 6

Попробуйте следующее:

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.*;

public class ErrorLogger
{
    private Logger logger;

    public ErrorLogger()
    {
        logger = Logger.getAnonymousLogger();

        configure();
    }

    private void configure()
    {
        try
        {
            String logsFolder = "logs";
            Files.createDirectories(Paths.get(logsFolder));
            FileHandler fileHandler = new FileHandler(logsFolder + File.separator + getCurrentTimeString() + ".log");
            logger.addHandler(fileHandler);
            SimpleFormatter formatter = new SimpleFormatter();
            fileHandler.setFormatter(formatter);
        } catch (IOException exception)
        {
            exception.printStackTrace();
        }

        addCloseHandlersShutdownHook();
    }

    private void addCloseHandlersShutdownHook()
    {
        Runtime.getRuntime().addShutdownHook(new Thread(() ->
        {
            // Close all handlers to get rid of empty .LCK files
            for (Handler handler : logger.getHandlers())
            {
                handler.close();
            }
        }));
    }

    private String getCurrentTimeString()
    {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
        return dateFormat.format(new Date());
    }

    public void log(Exception exception)
    {
        logger.log(Level.SEVERE, "", exception);
    }
}

Использование:

ErrorLogger errorLogger = new ErrorLogger();

try
{
    throw new Exception("I died!");
} catch (Exception exception)
{
    errorLogger.log(exception);
}