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

Posted

技术标签:

【中文标题】如何从 MATLAB applicationCompiler 命令中捕获错误【英文标题】:How to catch errors from the MATLAB applicationCompiler command 【发布时间】:2016-03-02 12:03:52 【问题描述】:

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

从文档看来,applicationCompiler 不返回通过/失败结果。它确实会引发在 MATLAB 命令窗口中以红色显示的错误。我相信我应该能够在 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 错误”。

谁能看出我做错了什么?

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

【问题讨论】:

你确认它真的是一个例外吗?我没有找到applicationCompiler 的任何文档(可能您需要许可证才能查看它),但它可能会返回错误代码并且不会引发异常。你能跑applicationCompiler -package harmonic_viewer.prj;disp('no error');吗?看到显示了吗? 对于 r2015b,请参阅 here。 deployTool 曾经有三种风格,具体取决于您要构建的内容,而 applicationCompiler 是构建的风格,然后将编译程序打包到安装程序中。这确实是一个错误;我重命名了其中一个源文件。 applicationCompiler 有点奇怪。它在后台运行,因此命令提示符会返回,但编译器会不断发出更多信息。引发错误时,它会像正常的 MATLAB 错误一样提前引发,然后控制返回到命令提示符。 如果它在后台运行,那么它一定是类似于this one 的问题,您的 try/catch 不再是堆栈的一部分。在没有代码的情况下调试这些东西有点棘手,但您可以尝试以下方法。将代码放入名为foo 的函数中并运行代码。收到rethrow(lasterror)中的错误类型后,返回什么?我的猜测是,foo 不是堆栈的一部分。 lasterror 也可能是获得异常的唯一方法,我在链接答案中建议的解决方法可能不适用于此处。 【参考方案1】:

编译在另一个线程上运行 - 你可以通过在编译过程中与 Matlab 进行交互来了解这一点。

解决这个问题的方法(有点破解)是创建一个构建后方法,该方法将读取命令窗口并查找关键字,即“包失败”或“包完成”或在您的情况下“错误:捕获”

例如

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

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

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

【讨论】:

+1 用于简单地知道如何操作。为了简化解析,最好使用isbusy 实现的here 并等待一切完成,然后获取输出。这样也可以删除clc 并查看最后一条消息。 谢谢。编译运行时状态栏不会说忙,所以你不能使用它。 clc 不是必需的,还有其他方法可以解决它 -> 但我发现它是最简单和最干净的方法! :)

以上是关于如何从 MATLAB applicationCompiler 命令中捕获错误的主要内容,如果未能解决你的问题,请参考以下文章

matlab如何将一个一维数组从大到小排序

如何将结构从 Matlab 代码转换为 C 代码(使用 Matlab 编译器)

如何将文件路径从 asp.net matlab ne builder dll 工具传递给 Matlab 函数

如何从 C++ 执行 Matlab 脚本

如何从 Python 与 MATLAB 交互?

如何使用 MatLAB 脚本从表中构建数组?