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

14

有没有一种方法将MATLAB错误信息保存到文件中?

这可能是一个简单的问题,但我在谷歌上找不到答案。我编译了一个GUI可执行文件,可以在没有MATLAB许可证的情况下使用,但偶尔会卡住。为了美观起见,我禁止了通常伴随此类可执行文件的命令窗口,因此我无法通过命令提示符获得错误消息。我想能够创建一个错误日志,可以通过电子邮件发送给我进行调试。

谢谢!

5个回答

13

在代码周围使用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'))。 - Andrew Janke
供其他人参考,我在这里找到了用于Gmail的sendmail()代码: http://www.mathworks.com/support/solutions/en/data/1-3PRRDV/index.html - Doresoom
感谢您的建议,Andrew和gnovice。 - Jonas

12
使用 "diary" 命令创建日志文件。这将使 Matlab 将所有命令行输出的副本,包括警告、错误消息和未处理异常的堆栈跟踪记录到文件中。在出现错误时,sendmail() 可以将其发送给您。如果要节省空间,可以让程序在正常退出(无错误)时删除其日志文件。
我认为这比使用 "try ... catch; write errors; end" 更可取,因为:
- 它将捕获所有未捕获的错误,包括从 AWT 线程引发的 Java 异常和 GUI 中 M 代码回调引发的错误,在这些情况下很难使用 try/catches。 - 如果 Matlab 崩溃严重,例如出现分段错误,M 代码级别的 try/catch 将无法捕获它。但日志文件可能仍然记录分段错误转储。 - 您可以发出进度消息、调试信息和警告,以提供有关导致错误的程序行为的更多信息,它们都将被记录。 - 我喜欢在 catch 块中保持代码最少。
还有一个相当等价的命令行选项,但我不知道如何在编译过的 Matlab 中调用它。

谢谢,如果我有时间的话,我也会尝试这个。我已经成功地调整了Jonas的代码版本。 - Doresoom
我个人更喜欢使用自己的日志文件(我的类都带有一个名为“log”的方法),因为我不想在命令窗口中混杂着所有的调试信息。然而,对于严重崩溃和Java异常,日记肯定非常有用。 - Jonas

3

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

对于较新版本的MATLAB,我建议使用MException捕获错误信息。你可以使用try-catch块捕获MException对象,就像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

您可以将消息字符串写入文件中。

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

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');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接