3

我有一个对象已被实例化为从串行NIRFlex类继承的类。当我尝试从命令行为属性分配值时:0Text_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但我需要确保输入的值仅为1or 2

我查看了带有属性的内置类型的子类文档@ MathWorks,但找不到答案。

4

1 回答 1

1

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

发生这种情况的原因是由于 中的以下代码serial.subsasgn,在对象继承自 的情况下会执行该代码serial

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

如您所见,MATLAB 最初尝试分别设置Valueof prop1(0Text_mode),然后您的内部类抛出一个错误,该错误被subsasgn's捕获catch,并替换aException为之前生成的具有不同原因的错误。

我可以建议几个选项:

  • 在您的set方法中,如果验证失败,而不是抛出错误,发出警告并将值设置为某个默认值,或者只是提及它没有从以前的任何内容修改。这样你就可以解决 MATLAB 的“错误吞咽”机制。
  • 联系 MATLAB 并要求他们解决此问题(即,使内部异常原因也可见)。
于 2019-07-29T07:44:36.197 回答