Сохранить выходные сообщения об ошибках в файл в MATLAB - PullRequest
12 голосов
/ 17 декабря 2009

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

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

Спасибо!

Ответы [ 5 ]

12 голосов
/ 17 декабря 2009

Используйте операторы 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 

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

11 голосов
/ 17 декабря 2009

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

ИМХО, это предпочтительнее использования "try ... catch; write error; end", потому что:

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

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

3 голосов
/ 17 декабря 2009

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

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

%# 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 для отображения отформатированной строки сообщения, включая информацию, содержащуюся в объекте MException:

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

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

2 голосов
/ 14 августа 2014
try
    % your code here
catch err
   fid = fopen('errorFile','a+');
   fprintf(fid, '%s', err.getReport('extended', 'hyperlinks','off'))
   fclose(fid)
end
1 голос
/ 06 апреля 2013

Для точного стиля форматирования, как в командном окне 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');
...