簡體   English   中英

嘗試在Matlab中捕獲塊

[英]try catch block in 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塊中。 有兩件事正在發生,一件是讀取文件,另一件是為train(i)分配imread值。 現在,這很重要,只有成功的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文檔時想出了嘗試和捕獲,如果有任何東西可以幫助我簡潔地編寫代碼,我將非常感激。

@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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM