设置子类 属性 导致意外错误
Setting subclass property results in an unexpected error
我有一个实例化为 class NIRFlex
的对象,它继承自 serial class。当我尝试从命令行将 0
的值分配给 属性 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'.
我的class定义、构造函数、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 但找不到答案。
此问题唯一令人困惑的方面是您看不到自定义错误消息,而是 serial
class.
生成的其他错误消息
发生这种情况的原因是 serial.subsasgn
中的以下代码,它在对象继承自 serial
的情况下执行:
catch aException
try
Obj = isetfield(Obj, prop1, Value);
catch %#ok<CTCH>
throw(localFixError(aException));
end
end
如您所见,MATLAB 最初尝试设置 prop1
的 Value
(分别为 0
和 Text_mode
),然后您的内部 class 抛出错误,该错误被 subsasgn
的 catch
捕获,并被更早生成的 aException
替换,原因不同。
我可以建议几个选项:
- 在您的
set
方法中,如果验证失败,不是抛出错误,而是发出警告并将值设置为某个默认值,或者只是提及它未从之前的任何内容进行修改。这样您就可以解决 MATLAB 的“error swallowing”机制。
- 联系 MATLAB 并要求他们解决此问题(即也使内部异常原因可见)。
我有一个实例化为 class NIRFlex
的对象,它继承自 serial class。当我尝试从命令行将 0
的值分配给 属性 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'.
我的class定义、构造函数、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 但找不到答案。
此问题唯一令人困惑的方面是您看不到自定义错误消息,而是 serial
class.
发生这种情况的原因是 serial.subsasgn
中的以下代码,它在对象继承自 serial
的情况下执行:
catch aException
try
Obj = isetfield(Obj, prop1, Value);
catch %#ok<CTCH>
throw(localFixError(aException));
end
end
如您所见,MATLAB 最初尝试设置 prop1
的 Value
(分别为 0
和 Text_mode
),然后您的内部 class 抛出错误,该错误被 subsasgn
的 catch
捕获,并被更早生成的 aException
替换,原因不同。
我可以建议几个选项:
- 在您的
set
方法中,如果验证失败,不是抛出错误,而是发出警告并将值设置为某个默认值,或者只是提及它未从之前的任何内容进行修改。这样您就可以解决 MATLAB 的“error swallowing”机制。 - 联系 MATLAB 并要求他们解决此问题(即也使内部异常原因可见)。