【问题标题】:try catch block in Matlab在 Matlab 中尝试 catch 块
【发布时间】:2013-12-23 05:32:32
【问题描述】:

所以,我正在通过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 文档时想出了 try and catch,如果有任何东西可以帮助我简洁地编写代码,我将不胜感激。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      您可以使用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。

      【讨论】:

      • 我觉得不用把train(i) = tempVar放在最后,可以放在try块里,catch块会显示错误,进入下一个循环没有继续。我希望这里有一些 Matlab 的“魔法”,无论如何我也会很满意,没有。
      • @whoknows:看起来我专注于修复您的第一个示例,而 @Jonas 专注于修复第二个示例。它们的主要区别在于您是否希望train 的长度始终 为N(我的),或者您是否希望它的长度仅等于有效图像的数量(Jonas)。如果乔纳斯的回答更好地满足您的需求,请随时给他支票。我不会介意的。 ;)
      猜你喜欢
      • 1970-01-01
      • 2010-12-25
      • 2023-03-18
      • 2023-03-15
      • 1970-01-01
      • 2015-10-07
      • 2021-11-26
      • 2013-01-01
      • 2022-06-10
      相关资源
      最近更新 更多