2009-12-16 3 views
12

Есть ли способ сохранить сообщения об ошибках MATLAB в файле?Сохранять сообщения об ошибках вывода в файл в MATLAB

Это может быть простая проблема, но Google не может дать мне ответ. Я скомпилировал исполняемый файл GUI для использования без лицензии MATLAB, и иногда он зависает. Для эстетических целей я подавил командное окно, обычно сопровождающее такой исполняемый файл, поэтому я не могу получить сообщение об ошибке из командной строки. Я хотел бы иметь возможность создать журнал ошибок, который может быть отправлен мне по электронной почте для отладки.

Спасибо!

ответ

11

Используйте команду «дневник», чтобы создать файл журнала. Это заставит Matlab записать копию всего вывода командной строки в файл, включая предупреждения, сообщения об ошибках и трассировки стека для необработанных исключений. Sendmail() может отправить его вам на ошибки. Если вы хотите сэкономить место, вы можете удалить программу из своего файла журнала при нормальной (без ошибок) выходе программы.

ИМХО это предпочтительнее, чтобы с помощью «Try ... Catch, ошибок записи, конца», потому что:

  • Он будет фиксировать все пойманные ошибки, в том числе Java исключений, поднятых из AWT нити и ошибок с М - обратные вызовы кода в вашем графическом интерфейсе, что может быть затруднено при попытке/улавливании.
  • Если Matlab сильно сбой, как с segfault, уровень/уровень M-кода try/catch не поймает его. Но файл дневника все еще может записывать свалку segfault.
  • Вы можете испускать сообщения о ходе выполнения, информацию об отладке и предупреждения, чтобы дать больше информации о поведении вашей программы, приводящем к ошибкам, и все они будут захвачены.
  • Мне нравится держать код в блоках catch минимальным.

Существует также опция командной строки, которая выполняет эквивалент; Я не знаю, как вызвать это для компилируемого Matlab.

+0

Спасибо, я попробую, если у меня будет время. У меня уже есть адаптированная версия кода Jonas. – Doresoom

+0

Я лично предпочитаю использовать свой собственный файл журнала (мои классы имеют метод «log»), потому что я не хочу загромождать окно команд со всей информацией об отладке. Однако для жестких сбоев и исключений java дневник, безусловно, очень полезен. – Jonas

11

Используйте try ... catch заявления вокруг кода. В блоке catch вы можете записать ошибку, включая информацию о стеке. Использование Sendmail, вы даже можете иметь код уведомить вас об ошибках по электронной почте (в идеале с всплывающим, что позволяет пользователям решить, хотят ли они, чтобы разделить информацию об аварии с вами)

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 

отредактирован быть немного более четко на как записать сообщение об ошибке в файл

+6

Вам не нужно форматировать сообщения и трассировки стека себя. Метод MException.getReport() сделает это для вас: fprintf (fid, '% s', err.getReport ('extended', 'hyperlinks', 'off')) –

+0

Для любой ссылки другого я нашел sendmail () для Gmail здесь: http://www.mathworks.com/support/solutions/en/data/1-3PRRDV/index.html – Doresoom

+0

Спасибо за предложение, Андрей и гновице. – Jonas

3

Для более старых версий MATLAB вы можете использовать функцию LASTERROR, чтобы получить информацию о последней ошибке, выпущенной MATLAB. Однако эта функция будет постепенно отменена в новых версиях MATLAB.

Для более новых версий MATLAB я бы предложил использовать MException class до capture error information. Вы можете поймать объект MException с помощью try-catch block в Jonas suggested, или вы могли бы потенциально использовать статический MException.last method, чтобы получить последний неперехваченное исключение (в зависимости от того, как вы запустите ваш код):

%# 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 

Какой бы путь вы захватить объект MException , вы можете использовать MException.getReport method для отображения отформатированной строки сообщения, включая информацию, содержащуюся в объекте MException:

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

вы можете написать строку сообщения в файл.

1

Для точного стиля форматирования, как из окна командной строки Matlab, используйте:

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