有没有办法将 MATLAB 错误消息保存到文件中?
这可能是一个简单的问题,但谷歌无法给我答案。我已经编译了一个 GUI 可执行文件,可以在没有 MATLAB 许可证的情况下使用,有时它会冻结。出于美观的目的,我取消了通常伴随此类可执行文件的命令窗口,因此我无法通过命令提示符获取错误消息。我希望能够创建一个错误日志,可以通过电子邮件发送给我进行调试。
谢谢!
有没有办法将 MATLAB 错误消息保存到文件中?
这可能是一个简单的问题,但谷歌无法给我答案。我已经编译了一个 GUI 可执行文件,可以在没有 MATLAB 许可证的情况下使用,有时它会冻结。出于美观的目的,我取消了通常伴随此类可执行文件的命令窗口,因此我无法通过命令提示符获取错误消息。我希望能够创建一个错误日志,可以通过电子邮件发送给我进行调试。
谢谢!
在代码周围使用 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
编辑为更明确地说明如何将错误消息写入文件
使用“日记”命令创建日志文件。这将使 Matlab 将所有命令行输出的副本写入文件,包括警告、错误消息和未处理异常的堆栈跟踪。然后 Sendmail() 可以在错误时将其发送给您。如果您想节省空间,您可以让程序在正常(无错误)程序退出时删除其日志文件。
恕我直言,这比使用“try ... catch; write errors; end”更好,因为:
还有一个等效的命令行选项;我不知道如何为已编译的 Matlab 调用它。
对于旧版本的 MATLAB,您可以使用LASTERROR函数来获取有关 MATLAB 发出的最新错误的信息。但是,此功能将在较新的 MATLAB 版本中逐步淘汰。
对于较新版本的 MATLAB,我建议使用MException类来捕获错误信息。您可以按照Jonas 的建议使用try-catch 块捕获 MException 对象,或者您可以使用静态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
然后,您可以将消息字符串写入文件。
try
% your code here
catch err
fid = fopen('errorFile','a+');
fprintf(fid, '%s', err.getReport('extended', 'hyperlinks','off'))
fclose(fid)
end
对于来自 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');