0

I don't understand Matlab's behaviour in the example below. On deserialization, it sets the properties of the object. This causes set.name to be executed. For the purpose of the example, I have constructed a case where an error is thrown in this method. In the first deserialization, the error is ignored and unhandled; the function simply stops execution at the error, code after the error is not executed. On the second deserialization, I have set dbstop if error, and now the error is triggered as I would expect. Questions follow below the example.

>> 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
  • Should I be surprised at this behaviour?
  • Is this MATLAB™ being strange, or would other programming languages engage similar behaviour?
  • Is there a good reason to behave like this?
4

1 に答える 1

0

おそらく、逆シリアル化コードはtry-catch、エラーを再スローしない構造を使用しています。ロード コードの障害により、少なくともデータへの部分的なアクセスが可能になるため、これにはいくつかの用途があります。一方、このようなことを行うと警告する必要があります。

実際にデータを読み込めない場合 (classdefファイルがパスにない場合など)、通知が表示されます。

だから私見、あなたは幸せで悲しいはずです.エラーは少なくとも部分的な結果をもたらしますが、MATLABは少なくともそのようなことが起こったという警告をスローする必要があります.

特定のコードに関して:globalグローバル変数はオブジェクトとは別に保存されるため、変数は最善の方法ではないと思います。static可能であれば、クラス変数(つまり)を使用します。ワークスペースのグローバル変数に依存しているためnames、これは私の知る限り MAT ファイルに保存されていません。

于 2012-05-18T10:26:38.260 に答える