2009-12-16 8 views
12

¿Hay alguna forma de guardar los mensajes de error de MATLAB en un archivo?Guardar los mensajes de error de salida en el archivo en MATLAB

Esto puede ser un problema simple, pero Google no pudo darme una respuesta. He compilado un ejecutable GUI para usar sin una licencia de MATLAB, y ocasionalmente se congela. Para fines estéticos, suprimí la ventana de comandos que normalmente acompaña a un ejecutable, por lo que no puedo obtener un mensaje de error a través del símbolo del sistema. Me gustaría poder crear un registro de errores que pueda enviarme por correo electrónico para la depuración.

Gracias!

Respuesta

11

Utilice el comando "diario" para crear un archivo de registro. Esto hará que Matlab escriba una copia de toda la salida de la línea de comando a un archivo, incluyendo advertencias, mensajes de error y los rastreos de la pila para las excepciones no controladas. Sendmail() puede enviártelo por error. Si desea ahorrar espacio, puede hacer que el programa elimine su archivo de registro en una salida de programa normal (sin error).

mi humilde opinión esto es preferible al uso de la "try ... catch; errores de escritura; final" porque:

  • capturará todos los errores sin capturar, incluidas las excepciones planteadas Java AWT desde el hilo y los errores de M -code devoluciones de llamada en su GUI, que puede ser difícil de conseguir try/capturas.
  • Si Matlab se cuelga con fuerza, al igual que con una falla de segmentación, el nivel de prueba/captura de nivel M no lo detectará. Pero el archivo diario aún puede registrar el volcado segfault.
  • Puede emitir mensajes de progreso, información de depuración y advertencias para proporcionar más información sobre el comportamiento de su programa que conduce a los errores, y todos serán capturados.
  • Me gusta mantener el código en los bloques de captura mínimo.

También hay una opción de línea de comandos que hace el equivalente; No sé cómo invocar eso para Matlab compilado.

+0

Gracias, voy a intentar esto también si tengo tiempo. Ya tengo una versión adaptada del código de Jonas funcionando. – Doresoom

+0

Personalmente estoy a favor de usar mi propio archivo de registro (todas mis clases vienen con un método llamado 'registro'), porque no quiero saturar la ventana de comandos con toda mi información de depuración. Sin embargo, para los bloqueos y las excepciones de Java, el diario es ciertamente muy útil. – Jonas

11

Utilice try ... catch statements alrededor del código. En el bloque catch, puedes escribir el error incluyendo la información de la pila. El uso de sendmail, puede incluso tener el código que le notifique de errores por correo (a ser posible con una ventana emergente que permite a los usuarios decidir si quieren compartir la información de bloqueo con usted)

try 
    % your code here 
catch err 
    %open file 
    fid = fopen('logFile','a+'); 
    % write the error to file 
    % first line: message 
    fprintf(fid,'%s\n',err.message); 

    % following lines: stack 
    for e=1:length(err.stack) 
     fprintf(fid,'%sin %s at %i\n',txt,err.stack(e).name,err.stack(e).line); 
    end 

    % close file 
    fclose(fid) 
end 

Editado a ser un poco más explícito en cómo escribir el mensaje de error en el archivo

+6

No es necesario formatear el mensaje y Seguimiento de la pila usted mismo. El método MException.getReport() lo hará por usted: fprintf (fid, '% s', err.getReport ('extended', 'hyperlinks', 'off')) –

+0

Para la referencia de cualquier otra persona, encontré sendmail () código para Gmail aquí: http://www.mathworks.com/support/solutions/en/data/1-3PRRDV/index.html – Doresoom

+0

Gracias por la sugerencia, Andrew y gnovice. – Jonas

3

Para versiones anteriores de MATLAB, puede utilizar la función LASTERROR para obtener información sobre el error más reciente emitido por MATLAB. Sin embargo, esta función se eliminará en las versiones más nuevas de MATLAB.

Para las versiones más nuevas de MATLAB, sugiero hacer uso de MException class a capture error information. Se puede coger un objeto MException utilizando un try-catch block como Jonas suggested, o usted podría utilizar la estática MException.last method para conseguir la última excepción no detectada (dependiendo de la forma de ejecutar su código):

%# OPTION 1: 
%# -------- 
try 
    my_code(); 
catch ME 
    %# Save data in ME to file 
end 
%# OPTION 2: 
%# -------- 
my_code(); 
ME = MException.last; 
%# Save data in ME to file 

Cualquiera sea la forma de capturar el objeto MException , se puede utilizar el MException.getReport method a mostrar una cadena de mensaje con formato incluyendo la información contenida en el objeto MException:

msgString = getReport(ME,'basic');  %# Displays the higher level error 
msgString = getReport(ME,'extended'); %# Displays the error and the stack 

entonces usted puede escribir la cadena del mensaje en un archivo.

1

Para el estilo de formato exacto como desde la ventana de comandos del Matlab, utilice:

rep = getReport(exception, 'extended', 'hyperlinks', 'off'); 

name = strcat('Data\', name, '.txt'); 
fid = fopen(name, 'w+t','n'); 
fprintf(fid, 'Error message\n-------------\n\n'); 
fprintf(fid, '%s\n', rep); 
fclose('all'); 
2
try 
    % your code here 
catch err 
    fid = fopen('errorFile','a+'); 
    fprintf(fid, '%s', err.getReport('extended', 'hyperlinks','off')) 
    fclose(fid) 
end 
Cuestiones relacionadas