Запись исключений в файл
Проект 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);
}