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

Posted

技术标签:

【中文标题】将输出错误消息保存到 MATLAB 中的文件【英文标题】:Save output error messages to file in MATLAB 【发布时间】:2010-12-27 11:19:18 【问题描述】:

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

这可能是一个简单的问题,但 Google 无法给我答案。我已经编译了一个 GUI 可执行文件,可以在没有 MATLAB 许可证的情况下使用,有时它会冻结。出于美观的目的,我取消了通常伴随此类可执行文件的命令窗口,因此我无法通过命令提示符获取错误消息。我希望能够创建一个错误日志,可以通过电子邮件发送给我进行调试。

谢谢!

【问题讨论】:

【参考方案1】:

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

对如何将错误消息写入文件进行了更明确的编辑

【讨论】:

您不需要自己格式化消息和堆栈跟踪。 MException.getReport() 方法将为您完成: fprintf(fid, '%s', err.getReport('extended', 'hyperlinks','off')) 供其他人参考,我在这里找到了 Gmail 的 sendmail() 代码:mathworks.com/support/solutions/en/data/1-3PRRDV/index.html 感谢 Andrew 和 gnovice 的建议。【参考方案2】:

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

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

它将捕获所有未捕获的错误,包括从 AWT 线程引发的 Java 异常和来自 GUI 中的 M 代码回调的错误,这些错误很难被尝试/捕获。 如果 Matlab 严重崩溃,例如出现段错误,M 代码级别的 try/catch 将无法捕获它。但日记文件可能仍会记录段错误转储。 您可以发出进度消息、调试信息和警告,以提供有关导致错误的程序行为的更多信息,并且它们都会被捕获。 我喜欢尽量减少 catch 块中的代码。

还有一个命令行选项可以做到这一点;我不知道如何为已编译的 Matlab 调用它。

【讨论】:

谢谢,有时间我也试试。我已经得到了 Jonas 代码的改编版本。 我个人喜欢使用我自己的日志文件(我的类都带有一个名为'log'的方法),因为我不想让我的所有调试信息弄乱命令窗口。不过,对于硬崩溃和java异常,日记当然是很有用的。【参考方案3】:

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

对于较新版本的 MATLAB,我建议使用 MException class 到 capture 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

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

【讨论】:

【参考方案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');

【讨论】:

以上是关于将输出错误消息保存到 MATLAB 中的文件的主要内容,如果未能解决你的问题,请参考以下文章

matlab中如何将输出的figure中的图像保存在我的文档中

重定向标准错误到标准输出 是啥意思

如何在 Matlab 中循环保存文件?

如何将直方图保存到matlab中的文件?

如何将数据结构中的字段保存到 Matlab 中的文件名字段?

如何将 LogCat 从 DDMS 定向到文件