2012-03-29 19 views
10

Utworzony przeze mnie projekt java ma być testowany na 1800 przypadków, a wynik każdego przypadku musi być zgodny ze złotym (pożądanym) wyjściem. Stworzyłem dla tego skryptu perl i uruchomiłem go na cygwin.Zapisuj wyjątki do pliku

Istnieje kilka przypadków, w których zgłaszane są wyjątki, ale są one błędnie uważane za poprawne. Chcę dodać blok catch catch w kodzie java, tak aby w przypadku wyjątku został on przechwycony, a ślad stosu jest drukowany na pliku 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(); 
    } 
} 

Ale to zastąpi poprzednią zawartość pliku, a na końcu plik zawiera ostatni zgłoszony wyjątek. W jaki sposób mogę napisać blok catch, aby stackTrace był drukowany, a zawartość pliku była nienaruszona i nie była zastępowana za każdym razem.

+0

Użyj innego constru ctor z FileWriter 'FileWriter (" exception.txt ", true);' – Kayser

+0

Możesz użyć Printstream do stacktrace. Wyjaśniłem, jak w odpowiedzi. – Kayser

Odpowiedz

20

Użyj tego konstruktor zamiast:

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

To jest opisany here.

EDIT: Zgodnie komentarzu poniżej Jona:

Jeśli chcesz wydrukować cały ślad stosu, należy użyć printStackTrace:

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

także użyć odpowiednich close połączeń po tym.

+0

Ale jak mogę napisać stackTrace? –

+0

To jest oddzielny problem. Możesz pobrać StackTraceElement [] z getStackTrace(), następnie dla każdego StackTraceElement użyj metod na StackTraceElement, aby uzyskać nazwę pliku, numer wiersza itp. Drukowanie każdego zestawu informacji do jednego wiersza. – Jon

+0

Można również użyć tego http://docs.oracle.com/javase/6/docs/api/java/lang/Throwable.html # printStackTrace (java.io.PrintWriter) i podaj PrintWriter, który otacza istniejący FileWriter. – Jon

5

Zastosowanie

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

stworzyć pisarza plików dopisywania.

4

Oto program, który pokazuje, co myślę, że trzeba:

 

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); 
     } 
    } 
} 
 

Wykorzystuje metodę printStackTrace(PrintWriter) na Throwable wydrukować całą ślad stosu na końcu pliku o nazwie „exception.txt”, a następnie istnieje metoda main(), która demonstruje użycie z dwoma przykładowymi wyjątkami. Jeśli uruchomisz go w swoim IDE, powinieneś znaleźć plik z dwoma zapisanymi stosami (działa dla mnie).

+1

+1 za zapamiętanie, że OP miał * również * pytanie o to, jak wydrukować ślad stosu. – ArjunShankar

9

Można użyć:

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

Spróbuj tego:

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); 
    } 
} 

Zastosowanie:

ErrorLogger errorLogger = new ErrorLogger(); 

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

Spróbuj tego:

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