Записать исключения в файл - PullRequest
13 голосов
/ 29 марта 2012

Ява-проект, который я создал, должен быть протестирован на 1800 случаев, и результат каждого случая должен совпадать с золотым (желаемым) результатом.Я создал Perl-скрипт для этого и запустил его на Cygwin.

Есть несколько случаев, в которых генерируются исключения, но они ошибочно считаются правильными.Я хочу добавить блок try catch в коде 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 печатался, а содержимое файла не повреждалось и не перезаписывалось каждый раз.

Ответы [ 6 ]

22 голосов
/ 29 марта 2012

Используйте этот конструктор вместо:

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

Он описан здесь .

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

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

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

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

10 голосов
/ 29 марта 2012

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

FileOutputStream fos = new FileOutputStream(new File("exception.txt"), true);  
PrintStream ps = new PrintStream(fos);  
e.printstacktrace(ps);
7 голосов
/ 29 марта 2012

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


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 голосов
/ 29 марта 2012

Используйте

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

для создания файла записи для добавления.

2 голосов
/ 02 ноября 2016

Попробуйте это:

PrintStream printStream = new PrintStream(new File("exception.txt"));
try {   
     //error proven code
} catch (Exception exception) {
     exception.printStackTrace(printStream);
}
1 голос
/ 17 марта 2016

Попробуйте:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...