아래 예제에서 Matlab의 동작을 이해하지 못합니다. deserialization에서 객체의 속성을 설정합니다. 이로 인해 set.name
이 실행됩니다. 예제의 목적을 위해이 메서드에서 오류가 발생하는 경우를 구성했습니다. 첫 번째 직렬화 해제에서 오류는 무시되고 처리되지 않습니다. 이 함수는 오류가 발생할 때 코드 실행을 멈추고 코드는 실행되지 않습니다. 두 번째 deserialization에서 dbstop if error
을 설정 했으므로 은입니다. 예제는 아래에 나와 있습니다.예상되는 동작입니까? MATLAB은 디버그 모드를 제외하고 역 직렬화시 오류를 무시합니다.
>> 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 ™이 이상합니까? 아니면 다른 프로그래밍 언어에서도 비슷한 동작을합니까?
- 이렇게 행동해야하는 이유가 있습니까?
저는 실제 세계에서는 '글로벌'을 사용하지 않습니다. 이 예제에서는 문제를 재현하는 최소 작업 예제 만 사용했습니다. 사실 나는 내 클래스의 모든 인스턴스 (이름순)를 보유하는 영구 구조를 사용합니다. – gerrit
'dbstop if error '는'try catch' 블록 ('catch catch' 오류가 발생할 경우 dbstop)의 오류에도 응답하지 않습니다. 그래서 이것이 혼란의 원인이되기 위해서는 (별도로 실행되도록 시도한) 전체 코드가 try catck 블록 안에 있어야합니다. –