Подтвердить что ты не робот

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

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

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

Спасибо!

4b9b3361

Ответ 1

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

IMHO, это предпочтительнее использовать "try... catch, write errors; end", потому что:

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

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

Ответ 2

Использовать 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 

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

Ответ 3

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

Для более новых версий MATLAB я бы предложил использовать класс MException до информация об ошибках захвата. Вы можете поймать объект MException, используя блок try-catch как предложенный Jonas, или вы могли бы использовать статический метод 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

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

Ответ 4

try
    % your code here
catch err
   fid = fopen('errorFile','a+');
   fprintf(fid, '%s', err.getReport('extended', 'hyperlinks','off'))
   fclose(fid)
end

Ответ 5

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