2016-03-02 106 views
3

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

从文档中看来,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块捕获错误并打印“交流错误”。

任何人都可以看到我做错了什么?

我使用64位Windows 7

+0

你确认它确实是个例外吗?我没有找到'applicationCompiler'的任何文档(可能你需要一个许可证来查看它),但它可能会返回一个错误代码并且不会抛出异常。你可以运行'applicationcompiler -package harmonic_viewer.prj; disp('no error');'?你看到disp吗? – Daniel

+0

对于r2015b,请参见[here](http://uk.mathworks.com/help/compiler_sdk/ml_code/deploytool.html)。 deployTool用于取决于您想要构建的三种版本,而applicationCompiler则是版本的风格,然后将编译程序打包到安装程序中。这确实是一个错误;我重命名了其中一个源文件。 applicationCompiler有点奇怪。它在后台运行,因此命令提示符会返回,但编译器会继续发送更多信息。当错误发生时,它会像正常的MATLAB错误那样提早提早并且控制返回到命令提示符。 –

+0

如果它在后台运行,那么它必定是一些类似于[this](http://stackoverflow.com/a/31971240/2732801)的问题,您的try/catch不再是堆栈的一部分。在没有代码的情况下调试这些东西有点棘手,但是您可以尝试以下方法。将代码放在一个名为'foo'的函数中并运行代码。在'rethrow(lasterror)'中收到错误类型后,它返回什么?我的猜测是,'foo'不是堆栈的一部分。 'lasterror'也可能是获得例外的唯一方法,我在链接答案中提出的解决方法可能不适用于此。 – Daniel

回答

2

的编制是在另一个线程运行MATLAB r2014a - 您可以同时编辑是怎么回事用Matlab进行交互的事实知道这一点。

解决这个问题的方法是创建一个后期构建方法,它将读取命令窗口并查找关键词,即“包失败”或“包完成”或在您的案例中“Error:Caught”

eg

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 

注意:你应该把时间限制在检查循环以及捕获一个无限循环的情况...

当然,你可以扩展这种搜索错误和关键字的情况下, 。

+0

+1仅仅知道如何去做。为了简化语法分析,使用'thisbusy'实现[here](http://www.mathworks.com/matlabcentral/fileexchange/32005-cmdwintool/content/CmdWinTool.m)可能是一个好主意,并且等到一切都完成完成,然后获得输出。这样,也可以删除'clc'并查看最后一条消息。 – Daniel

+1

谢谢。当编译运行时,状态栏并不是很忙,所以你不能使用它。该clc不是必需的,并且还有其他方法 - >但我发现它是最简单和最干净的方法! :) – matlabgui

相关问题