在Matlab

时间:2017-10-10 21:48:03

标签: matlab matlab-class

我有一个对象已被实例化为类" NIRFlex"它继承自serial类。当我尝试在命令行中使用以下内容将属性Text_mode分配给零时:

>> N.Text_mode = 0

我收到以下错误:

Error using serial/subsasgn (line 146) 
The name 'Text_mode' is not an accessible property for an instance of class 'serial port objects'.

我的类定义,构造函数和set方法如下

classdef NIRFlex < serial

    properties
        Text_mode
    end
    methods
        function obj = NIRFlex(port)
            obj = obj@serial(port);
        end

        function obj = set.Text_mode(obj,mode)
            if (mode == 1)||(mode == 2)
                obj.Text_mode = mode;
            else
                error('Invalid Text Mode');
            end
        end
    end
end

如果我删除set方法,我可以指定任意值,我喜欢命令行中的Text_mode属性,但我需要确保输入的值只有1或2。

我查看了Subclasses of Built-In Types with Properties文档@ MathWorks但找不到答案。

1 个答案:

答案 0 :(得分:1)

此问题唯一令人困惑的方面是,您看不到自定义错误消息,而是看到serial类生成的其他错误消息。

发生这种情况的原因是由于serial.subsasgn中的以下代码在某些情况下会被执行,例如从serial继承的对象:

    catch aException
        try
            Obj = isetfield(Obj, prop1, Value);
        catch %#ok<CTCH>
            throw(localFixError(aException));
        end
    end

如您所见,MATLAB最初尝试设置Value的{​​{1}}(分别为prop10),然后您的内部类会引发错误,被Text_mode的{​​{1}}捕获,并被更早生成的subsasgn替换,其原因不同。

我可以提出几个选择:

  • 在您的catch方法中,如果验证失败,则不会引发错误,而是发出警告,并将该值设置为某个默认值,或者只是提及它从未被修改过。这样,您可以解决MATLAB的“ error swallowing”机制。
  • 联系MATLAB并要求他们解决此问题(即,使内部异常原因也可见)。