matlab - 设置子类属性导致意外错误

标签 matlab runtime-error subclass setter 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'.

我的类定义、构造函数和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

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

最佳答案

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

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

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

如您所见,MATLAB 最初尝试设置 prop1Value(0Text_mode,分别),然后你的内部类抛出一个错误,它被 subsasgncatch 捕获,并被生成的 aException 替换更早并且有不同的原因。

我可以建议几个选项:

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

关于matlab - 设置子类属性导致意外错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46676561/

相关文章:

php - PHP-带有Euler常数的 “Division by zero”

java - 子类抛出 UnsupportedOperationException 与忽略输入参数

python - 从不同目录实例化Python子类

matlab - 在matlab中从数组中提取实数

cocoa-touch - 从应用商店下载时,应用崩溃

matlab - fprintf : new line after a certain point

vba - Scripting.Dictionary 在不使用 Dictionary.Add 的情况下添加项目 - BUG?

python - 子类化装饰类

Matlab `rowfun` 具有多个输出的函数: Safe to assume row order?

matlab - 多个嵌入 for 循环的向量化