Сохранять сообщения об ошибках вывода в файл в MATLAB
Есть ли способ сохранить сообщения об ошибках MATLAB в файле?
Это может быть простая проблема, но Google не может дать мне ответ. Я скомпилировал исполняемый файл GUI для использования без лицензии MATLAB, и иногда он зависает. Для эстетических целей я подавил командное окно, обычно сопровождающее такой исполняемый файл, поэтому я не могу получить сообщение об ошибке из командной строки. Я бы хотел создать журнал ошибок, который можно отправить по электронной почте для отладки.
Спасибо!
Ответы
Ответ 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');