【问题标题】:Setting subclass property results in an unexpected error设置子类属性会导致意外错误
【发布时间】:2018-03-22 10:34:29
【问题描述】:

我有一个对象被实例化为类NIRFlex,它继承自serial 类。当我尝试从命令行为属性Text_mode 赋值0 时:

>> 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 属性分配任意值,但我需要确保输入的值仅为12

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

【问题讨论】:

  • 有趣的是,实际上是 error 命令产生了该错误。有趣的。删除 error 命令或将其替换为任何其他命令将使代码正常工作。此参考 mathworks.com/help/matlab/matlab_oop/… 涵盖了具有“if-else-error”结构但仅适用于非继承类的属性集方法。
  • @Yvon 这很奇怪。我删除了error 命令,它似乎工作正常。如果我用一个简单的disp() 命令替换error,只要传递给set 方法的参数是数字,那么一切正常,否则返回相同的错误。我彻底迷惑了!
  • 如果设置断点并查看引发错误的代码 (subsasgn),无论在 set 方法中生成什么错误,都会有一个 try-catch 块抛出该错误消息.基本上你的错误信息被提升到了 catch 块。

标签: matlab runtime-error subclass setter matlab-class


【解决方案1】:

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

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

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

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

我可以建议几个选项:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    相关资源
    最近更新 更多