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