有没有办法在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
构造那么可读。我一直在努力提高代码质量和可读性。还有更好的方法吗?
答案 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