如何从 MATLAB applicationCompiler 命令中捕获错误

How to catch errors from the MATLAB applicationCompiler command

我正在使用命令 applicationCompiler -package harmonic_viewer.prj 编译 MATLAB 程序以供分发。有时我错过了一个文件,应用程序编译器会抛出错误。我想捕获此类错误并将错误向上传递以终止编译多个程序的 Windows 批处理脚本。

从文档看来,applicationCompiler 没有 return pass/fail 结果。它确实抛出了一个在 MATLAB 命令 window 中以红色显示的错误。我相信我应该能够在 try-catch-end 块中捕获错误,但它对我不起作用。这是一个示例会话

>> try
applicationCompiler -package harmonic_viewer.prj
catch me
disp('ac error')
end
Error: Caught exception when packaging project: C:\build_matlab\source\harmonic_viewer\harmonic_viewer.prj
com.mathworks.project.api.InvalidProjectException
File filteredunwrap.m from Files required for your application to run does not exist.
>> 

我希望 try-catch-end 块捕获错误并打印 'ac error'。

谁能看出我做错了什么?

我在 64 位上使用 MATLAB r2014a Windows 7.

编译在另一个线程上 运行 - 你知道这一点,因为你可以在编译进行时与 Matlab 交互。

解决此问题的方法(有点 hack)是创建一个 post 构建方法,该方法将读取命令 window 并查找关键字,即 "Package failed" 或 "package finished" 或者在你的情况下 "Error: Caught"

例如

clc
applicationCompiler -package yourProject.prj
cmdWinDoc = com.mathworks.mde.cmdwin.CmdWinDocument.getInstance;
% loop until condition found
while true
  pause ( 2 )
  myTxt = cmdWinDoc.getText(cmdWinDoc.getStartPosition.getOffset,cmdWinDoc.getLength);
  %
  if ~isempty ( strfind ( myTxt, 'Package finished' ) )
    fprintf ( 'Woo hoo - it worked!!! :)\n' );
    break
  end
  if ~isempty ( strfind ( myTxt, 'Package failed' ) )
    fprintf ( 'Uh oh - it failed!!! :)\n' );
    break
  end
end

注意:您还应该在循环中进行时间限制检查,以捕获无限循环情况...

您当然可以扩展它以搜索您的案例的错误和关键字。