2012-03-29 13 views
10

El proyecto java que he creado debe probarse para 1800 casos y la salida de cada caso debe coincidir con la salida dorada (deseada). Creé un script de Perl para esto y lo ejecuté en cygwin.Escribir excepciones en el archivo

Hay unos pocos casos que arrojan excepciones, pero se consideran incorrectamente como correctos. Quiero agregar un bloque try catch en el código java para que, si se lanza alguna excepción, se capture y el seguimiento de la pila se imprima en el archivo 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(); 
    } 
} 

Pero esto sobrescribe el contenido del archivo anterior y, finalmente, el archivo contiene la última excepción lanzada. ¿Cómo puedo escribir catch block para que stackTrace se imprima y el contenido del archivo esté intacto y no se sobrescriba cada vez?

+0

Use otro constru ctor de FileWriter 'FileWriter (" exception.txt ", true);' – Kayser

+0

Puede usar Printstream para stacktrace. Expliqué cómo en la respuesta. – Kayser

Respuesta

20

Usar este constructor en su lugar:

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

Se describe here.

EDITAR: Según el comentario más abajo de Jon:

Si desea imprimir toda la traza de la pila, utilice printStackTrace:

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

También, utilizar las llamadas apropiadas close después de eso.

+0

Pero, ¿cómo puedo escribir el stackTrace? –

+0

Ese es un problema aparte. Puede obtener StackTraceElement [] de getStackTrace(), luego, para cada StackTraceElement, use los métodos en StackTraceElement para obtener el nombre del archivo, el número de línea, etc. Imprima cada conjunto de información en una línea. – Jon

+0

También podría usar este http://docs.oracle.com/javase/6/docs/api/java/lang/Throwable.html # printStackTrace (java.io.PrintWriter) y suministra un PrintWriter que ajusta su FileWriter existente. – Jon

5

Uso

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

para crear un archivo de escritor adjuntas.

4

Aquí es un programa que demuestra lo que creo que es necesario:

 

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

Se utiliza el método printStackTrace(PrintWriter) en Throwable imprimir todo el seguimiento de la pila hasta el final de un archivo llamado "exception.txt", a continuación, hay un método main() que demuestra el uso con dos excepciones de muestra. Si lo ejecuta en su IDE, debería encontrar que obtiene un archivo con dos trazos de pila escritos (funciona para mí).

+1

+1 para recordar que OP también * también * preguntó acerca de cómo imprimir el seguimiento de la pila. – ArjunShankar

9

Se puede utilizar:

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

Prueba esto:

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

Uso:

ErrorLogger errorLogger = new ErrorLogger(); 

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

Prueba esto:

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