2012-03-29 20 views
10

Il progetto Java che ho creato è quello di essere testati per 1800 casi e l'uscita di ogni singolo caso deve abbinato con l'uscita d'oro (desiderato). Ho creato uno script perl per questo e l'ho eseguito su cygwin.Eccezioni scrivere sul file

ci sono alcuni casi che gettano le eccezioni, ma sono erroneamente considerati corretti. Voglio aggiungere un blocco try catture in codice Java in modo che se viene lanciata alcuna eccezione viene catturato e traccia dello stack è stampato su file 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(); 
    } 
} 

Ma questo sovrascrive il contenuto del file precedente e infine il file contiene l'ultima eccezione generata. Come posso scrivere blocco catch in modo che stackTrace viene stampato e il contenuto del file sono intatti e non sovrascritto ogni volta.

+0

Utilizzare un altro constru ctor di FileWriter 'FileWriter (" exception.txt ", true);' – Kayser

+0

È possibile utilizzare Printstream per stacktrace. Ho spiegato come nella risposta. – Kayser

risposta

20

Utilizzare questo costruttore invece:

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

È descritto here.

EDIT: Come per il commento di Jon di seguito:

Se si desidera stampare l'intera traccia dello stack, utilizzare printStackTrace:

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

Inoltre, utilizzare le appropriate close chiamate dopo.

+0

Ma come posso scrivere stackTrace? –

+0

Questo è un problema separato. È possibile ottenere StackTraceElement [] da getStackTrace(), quindi per ogni StackTraceElement utilizzare i metodi su StackTraceElement per ottenere il nome del file, il numero di riga e così via. Stampa ogni set di informazioni su una riga. – Jon

+0

Si potrebbe anche usare questo http://docs.oracle.com/javase/6/docs/api/java/lang/Throwable.html # printStackTrace (java.io.PrintWriter) e fornisce un PrintWriter che avvolge il tuo FileWriter esistente. – Jon

5

Usa

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

per creare uno scrittore file di accodamento.

4

Ecco un programma che illustra quello che penso è necessario:

 

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

usa il metodo printStackTrace(PrintWriter) su Throwable per stampare l'intera traccia dello stack alla fine di un file chiamato "exception.txt", quindi c'è un metodo main() che dimostra l'utilizzo con due eccezioni di esempio. Se si esegue nel vostro IDE, si dovrebbe trovare che si ottiene un file con due tracce dello stack scritte ad esso (funziona per me).

+1

+1 per ricordare che l'OP aveva * anche * chiesto come stampare la traccia dello stack. – ArjunShankar

9

È possibile utilizzare:

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

Prova questa:

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

Usage:

ErrorLogger errorLogger = new ErrorLogger(); 

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

Prova questo:

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