在下面的示例中,我不了解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
最佳答案
反序列化代码可能使用了不会抛出错误的try-catch
构造。我可以看到一些用处,因为加载代码中的错误至少会使您部分访问数据。另一方面,当它执行此类操作时,它应该警告您。
当它确实无法加载数据时(例如,您的classdef
文件不在路径中时),它将显示一条通知。
因此,恕我直言,您应该既开心又难过:错误至少会给您部分结果,另一方面,MATLAB至少应发出警告,指出发生了此类情况。
关于您的特定代码:我认为global
变量不是最佳选择,因为全局变量是独立于对象存储的。如果可能的话,我会选择一个类变量(即static
)。因为现在您依赖工作空间中的全局变量names
,据我所知,该变量未保存在MAT文件中。
关于debugging - 预期的行为?除在 Debug模式下外,MATLAB会忽略反序列化时的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10604721/