带有字符串数组的MATLAB开关盒

时间:2017-03-13 20:31:17

标签: string matlab exception-handling switch-statement cell-array

有没有办法在MATLAB中使用switch语句来操作字符串的单元格数组,以便执行其字符串参数与单元格数组中的任何字符串匹配的第一个case语句?

此问题的上下文是处理catch块中的错误。

假设我正在尝试加载图片文件:

path = 'c:\where my files are located';
format = 'MRIm%03d.dcm';

try
    firstheader = dicomread(fullfile(path, sprintf(format, 1)));
catch ex
    % extract last segment of exception identifier
    idSegLast = regexp(ex.identifier, '(?<=:)\w+$', 'match');

    switch idSegLast
        case 'noFileOrMessagesFound'
            disp('No File Or Messages Found');
            return;
        case 'fileNotFound'
            disp('File Not Found');
            return;
        otherwise
            rethrow(ex);
    end
end

上面代码中的switch语句不起作用,因为idSegLast是字符串的单元格数组。大多数情况下,idSegLast只有一个元素,但如果抛出多个异常,它可能会有多个元素。

当然上面的switch语句(不起作用)可以替换为以下if-else块,它实现了所需的行为:

if (strcmp(idSegLast, 'noFileOrMessagesFound'))
    disp('No File Or Messages Found');
    return;
elseif (strcmp(idSegLast, 'fileNotFound'))
    disp('File Not Found');
    return;
else
    rethrow(ex);
end

但是,随着代码中添加了额外的异常处理,它将不可避免地变得不如switch - case构造那么可读。我一直在努力提高代码质量和可读性。还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以将ismember与要跟踪的异常列表一起使用来解析cellstring idSegLast。这很笨拙,但似乎对我有用。

switch num2str(ismember({'noFileOrMessagesFound', 'fileNotFound'}, ...
        idSegLast))
    case '1  0'
        disp('No File Or Messages Found');
        return;
    case '0  1'
        disp('File Not Found');
        return;
    case '1  1' % don't know if it's  possible, but better safe than sorry
        disp('No File Or Messages Found and File Not Found');
        return;
    otherwise
        rethrow(ex);
end