我有一个GUI,我想捕获错误并处理我调用的generateReport函数。第一个GUI文件(有多个窗口,每个窗口都带有它自己的编程GUI文件)是CSTMainWindow,程序是从Celest函数运行的。
CELEST:
function CeleST
c(@CSTMainWindow); % line 3
end
c.m只是函数的包装器,所以我可以尝试/捕获它们,所以我不必在每个子函数中编写代码
function c(fxn)
% Function to wrap callback functions with try/catch and call
% generateReport.m in case of error
try
fxn(); % line 6
catch exception
generateReport(exception)
end
end
所以CSTMainWindow被调用但是它在这一行上断了(真的是第一个GUI代码行) CSTMainWindow.m第142行:
mainFigure = figure('Visible','off','Position',[5,40,mainW,mainH],'Name','CeleST: Check results','numbertitle','off', 'menubar', 'none', 'resizefcn', c(@resizeMainFigure));
调试时,c.m捕获错误:
标识符:' MATLAB:TooManyOutputs'
消息:'输出参数太多。'
堆栈:
线路名称
142 CSTMainWindow
6 c
3 CeleST
在尝试解决这个问题时,我发现将回调更改为resizeMainFigure修复了它有意义,但是为了得到我想要的try / catch行为,我将不得不在我以前所做的每个地方以及我和#39;我试图避免。
我的问题是如果CSTMainWindow的输出参数为零,并且resizeMainFigure(下面没有参考)
,我为什么会得到太多的输出参数?function resizeMainFigure(hObject,eventdata) %#ok<INUSD>
% -------
% Update the size and position of the sliders
% -------
newPosition = get(mainFigure,'position');
set(sliderHoriz, 'position',[0 0 newPosition(3)-20 20]);
set(sliderVert, 'position',[newPosition(3)-20 20 20 newPosition(4)-20]);
% -------
% Check the horizontal slider
% -------
if newPosition(3) < mainPanelPosition(3)
deltaH = round(mainPanelPosition(3) - newPosition(3));
newValue = min(deltaH,get(sliderHoriz,'value'));
set(sliderHoriz, 'enable', 'on', 'min',0,'max',deltaH,'value',newValue);
else
set(sliderHoriz, 'enable', 'off','min',0,'max',1,'value',0);
end
% -------
% Check the vertical slider
% -------
if newPosition(4) < mainPanelPosition(4)
deltaV = round(mainPanelPosition(4) - newPosition(4));
newValue = min(deltaV,get(sliderVert,'value'));
set(sliderVert, 'enable', 'on', 'min',0,'max',deltaV,'value',newValue);
else
set(sliderVert, 'enable', 'off','min',0,'max',1,'value',0);
end
setMainPanelPositionBySliders
end
答案 0 :(得分:3)
检查最后一个参数以确定您的身份。它是对c的函数调用,它不返回任何内容,但是您将它作为参数传递给数字调用。 c没有返回值,但实际上,您要求它为您返回一个值。基于figure documentation,您必须提供函数句柄,包含函数句柄的单元格数组,或者是resizefcn的有效MATLAB表达式的字符串。您可以尝试将函数调用转换为字符串:
mainFigure = figure('Visible','off','Position',[5,40,mainW,mainH],'Name','CeleST: Check results','numbertitle','off', 'menubar', 'none', 'resizefcn', 'c(@resizeMainFigure)');