0

在下面的示例中,我不理解 Matlab 的行为。在反序列化时,它设置对象的属性。这导致set.name被执行。出于示例的目的,我构建了一个在此方法中引发错误的案例。在第一次反序列化中,错误被忽略且未处理;该函数只是在错误处停止执行,错误后的代码不执行。在第二次反序列化时,我设置dbstop if error了 ,现在按我的预期触发了错误。问题在示例下方。

>> clear all;
>> dbstatus;
>> type Tester.m;

classdef Tester < handle
    properties
        name;
    end

    methods
        function self = Tester()
            disp('Creating Tester object');
        end

        function set.name(self, val)
            global allnames
            if isequal(allnames, [])
                allnames = {};
            end
            if any(strcmp(allnames, val))
                fprintf(1, 'Name already exists. Will issue error.\n');
                error('Error: duplicate name %s', val);
                fprintf(1, 'Still here?\n');
            else
                self.name = val;
                allnames = [allnames self.name];
            end
        end
    end
end

>> t = Tester();
Creating Tester object
>> t.name = 'abc';
>> save('/tmp/fubar.mat', 't');
>> load('/tmp/fubar.mat')
Name already exists. Will issue error.
>> dbstop if error
>> load('/tmp/fubar.mat')
Name already exists. Will issue error.
Error using Tester/set.name (line 18)
Error: duplicate name abc

18                  error('Error: duplicate name %s', val);
K>> dbquit
  • 我应该对这种行为感到惊讶吗?
  • 这个 MATLAB™ 是不是很奇怪,还是其他编程语言会出现类似的行为?
  • 这样做有充分的理由吗?
4

1 回答 1

0

反序列化代码可能使用了try-catch不会重新引发错误的构造。我可以看到它的一些用途,因为加载代码中的错误至少会让您部分访问您的数据。另一方面,它应该在执行此类操作时向您发出警告。

当它真的无法加载数据时(例如,当您的classdef文件不在路径中时),它会显示一个通知。

所以恕我直言,你应该既高兴又悲伤:一个错误至少会给你部分结果,另一方面,MATLAB 至少应该发出警告,表明发生了这样的事情。

关于您的特定代码:我认为该global变量不是最好的方法,因为全局变量独立于您的对象存储。如果可能的话,我会选择一个类变量(即static)。因为现在您依赖于names工作区中的全局变量,据我所知,该变量并未保存在 MAT 文件中。

于 2012-05-18T10:26:38.260 回答