预期的行为?除非在调试模式下,否则MATLAB会忽略反序列化时的错误

时间:2012-05-15 16:09:04

标签: debugging matlab error-handling deserialization

我不理解下面示例中的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™是奇怪的,还是其他编程语言会有类似的行为?
  • 有充分的理由表现得像这样吗?

1 个答案:

答案 0 :(得分:0)

反序列化代码可能使用不会重新抛出错误的try-catch构造。我可以看到一些用途,因为加载代码中的错误至少可以让您部分访问您的数据。另一方面,当它做这样的事情时,它应该警告你。

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

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

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