debugging - 预期的行为?除在 Debug模式下外,MATLAB会忽略反序列化时的错误

标签 debugging matlab error-handling deserialization

在下面的示例中,我不了解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™很奇怪吗,还是其他编程语言也会采用类似的行为?
  • 是否有充分的理由要这样做?
  • 最佳答案

    反序列化代码可能使用了不会抛出错误的try-catch构造。我可以看到一些用处,因为加载代码中的错误至少会使您部分访问数据。另一方面,当它执行此类操作时,它应该警告您。

    当它确实无法加载数据时(例如,您的classdef文件不在路径中时),它将显示一条通知。

    因此,恕我直言,您应该既开心又难过:错误至少会给您部分结果,另一方面,MATLAB至少应发出警告,指出发生了此类情况。

    关于您的特定代码:我认为global变量不是最佳选择,因为全局变量是独立于对象存储的。如果可能的话,我会选择一个类变量(即static)。因为现在您依赖工作空间中的全局变量names,据我所知,该变量未保存在MAT文件中。

    关于debugging - 预期的行为?除在 Debug模式下外,MATLAB会忽略反序列化时的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10604721/

    相关文章:

    linux - 当命令失败并出现错误时,获取fabric.local或run或sudo的输出

    r - 记录错误消息并将其写入数据框

    java - IntelliJ 线程调试

    .net - 如何在多进程系统上使用单个proc进行调试?

    CS 50- Pset 1 马里奥程序

    matlab - 如何绘制这个?

    maven - Tomcat 错误 'The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.'

    c# - 到飞机的距离

    Matlab:实现 CTRL+C 所做的,但在代码中

    matlab - 在 Matlab 中执行 CUDA 代码