Matlab来自GUI图形声明的输出参数太多

时间:2015-08-13 15:47:48

标签: matlab callback try-catch

我有一个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

1 个答案:

答案 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)');