我不理解下面示例中的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
答案 0 :(得分:0)
反序列化代码可能使用不会重新抛出错误的try-catch
构造。我可以看到一些用途,因为加载代码中的错误至少可以让您部分访问您的数据。另一方面,当它做这样的事情时,它应该警告你。
当它真的无法加载数据时(例如,当您的classdef
文件不在路径中时),它会显示通知。
恕我直言,你应该感到高兴和悲伤:错误至少会给你部分结果,另一方面,MATLAB至少应该发出警告,说明发生了这样的事情。
关于您的特定代码:我认为global
变量不是最好的方法,因为全局变量独立于您的对象存储。如果可能的话,我会使用类变量(即static
)。因为现在你依赖于工作区中的全局变量names
,据我所知,它不会保存在MAT文件中。