尝试在Matlab中捕获块

时间:2013-12-23 05:32:32

标签: matlab

所以,我正在通过imread('D:\pic1\foo.jpg')阅读数百个图像文件,其中一些像imread('D:\pic2\Thumbs.db')。阅读后,我将存储在这样的数据库train(i) = imread('D:\pic1\foo.jpg')中。问题在于imread('D:\pic2\Thumbs.db'),这些文件的读取显然会出错。我想像这样缓解这个问题:

for i=1:N
  try
    train(i) = imread(link{i})

    %link{i} can be 'D:\pic2\Thumbs.db' or 'D:\pic1\foo.jpg'

  catch 
    disp('Error')
  end
end

问题在于此处的try块。有两件事正在发生,一件是读取文件另一件事是将imread值分配给train(i)。现在,这很重要,只有成功的imread()如果有任务,失败就会出现错误。 Matlab通过catch块来处理错误,没有一个块来处理我可以完成赋值的成功条件,这样我就可以轻松地进行读写操作。

我想要这样的事情:

j = 0;
for i=1:N

  try:
   imread(links{i})

  if success:
   train(j) = imread(links{i})
   j = j+1;

  if fail:
   error
  end

end

我只是在搜索Matlab文档时尝试捕获,如果有任何东西可以帮助我简洁地编写代码,我将非常感激。

2 个答案:

答案 0 :(得分:11)

solution by @gnovice是正确的,但可以更简洁地写出来:

ct = 1;
for i=1:N

  try
   train(ct) = imread(links{i});
   ct = ct +1; %# if imread fails, this line is not executed

  catch me
    %# report the problematic image, and the reason for failure
    fprintf('image #%i (%s) cannot be opened: %s\n',i,links{i},me.message)
  end

end

答案 1 :(得分:3)

您可以使用continue语句和临时变量解决此问题,如下所示:

for i=1:N
  try
    tempVar = imread(link{i});
  catch 
    disp(['Error reading file ' link{i}]);
    continue
  end
  train(i) = tempVar;
end

imread抛出错误时,控制权将传递给catch块,该块显示一条消息,然后调用continue将控制传递给for循环的下一次迭代,跳过任何后来的命令。成功imread后,运行try\catch块后面的代码,将imread的输出分配给变量train