2012-05-15 2 views
0

아래 예제에서 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 ™이 이상합니까? 아니면 다른 프로그래밍 언어에서도 비슷한 동작을합니까?
  • 이렇게 행동해야하는 이유가 있습니까?

답변

0

아마 deserialization 코드는 오류를 다시 발생시키지 않는 try-catch 구조를 사용합니다. 로드 코드의 오류로 인해 데이터에 부분적으로 액세스 할 수 있기 때문에 일부 용도가 있음을 알 수 있습니다. 다른 한편으로, 이런 일을 할 때 경고해야합니다.

실제로 데이터를로드 할 수없는 경우 (예 : classdef 파일이 경로에없는 경우) 알림이 표시됩니다.

이렇게 IMHO라면 행복하고 슬프다. 적어도 부분적인 결과는 있지만, MATLAB은 적어도 그런 일이 일어났다는 경고를 던져야한다.

특정 코드와 관련 : 전역 변수가 개체와 독립적으로 저장되므로 global 변수는 최선의 방법이 아닙니다. 가능한 경우 클래스 변수 (예 : static)를 사용합니다. 이제는 작업 공간에있는 전역 변수 names에 의존하기 때문에, 알고있는 한 MAT 파일에 저장되지 않습니다.

+0

저는 실제 세계에서는 '글로벌'을 사용하지 않습니다. 이 예제에서는 문제를 재현하는 최소 작업 예제 만 사용했습니다. 사실 나는 내 클래스의 모든 인스턴스 (이름순)를 보유하는 영구 구조를 사용합니다. – gerrit

+0

'dbstop if error '는'try catch' 블록 ('catch catch' 오류가 발생할 경우 dbstop)의 오류에도 응답하지 않습니다. 그래서 이것이 혼란의 원인이되기 위해서는 (별도로 실행되도록 시도한) 전체 코드가 try catck 블록 안에 있어야합니다. –

관련 문제