在MATLAB中将输出错误消息保存到文件中

时间:2009-12-16 23:17:09

标签: matlab error-reporting

有没有办法将MATLAB错误消息保存到文件中?

这可能是一个简单的问题,但谷歌无法给我答案。我编译了一个GUI可执行文件,可以在没有MATLAB许可证的情况下使用,偶尔会冻结。出于审美目的,我通常附带这样的可执行文件来抑制命令窗口,因此我无法通过命令提示符输出错误消息。我希望能够创建一个错误日志,可以通过电子邮件发送给我进行调试。

谢谢!

5 个答案:

答案 0 :(得分:12)

在代码周围使用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 

编辑有关如何将错误消息写入文件

的更明确

答案 1 :(得分:11)

使用“diary”命令创建日志文件。这将使Matlab将所有命令行输出的副本写入文件,包括警告,错误消息和未处理异常的堆栈跟踪。然后,Sendmail()可以在发生错误时将其发送给您。如果要节省空间,可以让程序在正常(无错误)程序退出时删除其日志文件。

恕我直言,这比使用“try ... catch; write errors; end”更可取,因为:

  • 它将捕获所有未捕获的错误,包括从AWT线程引发的Java异常以及GUI中M代码回调的错误,这些错误很难得到尝试/捕获。
  • 如果Matlab崩溃,就像使用段错误一样,M代码级别的try / catch将无法捕获它。但是日记文件仍然可以记录段错误转储。
  • 您可以发出进度消息,调试信息和警告,以提供有关程序导致错误的行为的更多信息,并且它们都将被捕获。
  • 我喜欢将catch块中的代码保持最小。

还有一个命令行选项可以执行等效操作;我不知道如何为编译的Matlab调用它。

答案 2 :(得分:3)

对于旧版本的MATLAB,您可以使用LASTERROR函数获取有关MATLAB发布的最新错误的信息。但是,此功能将在较新的MATLAB版本中逐步淘汰。

对于较新版本的MATLAB,我建议您使用MException classcapture error information。您可以使用try-catch block作为Jonas suggested来捕获MException对象,或者您可以使用静态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

然后,您可以将消息字符串写入文件。

答案 3 :(得分:2)

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

答案 4 :(得分: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');