Как повторить итерацию цикла в Matlab, если произошла ошибка

У меня есть этот код в MATLAB:

for i = 1: n
   a = randi([0 500]);
   function (a);
end

Когда есть ошибка во время выполнения function(a) в итерации i=k программа останавливается. Есть ли способ заставить программу повторить ту же итерацию (при возникновении ошибки) с новым значением a и продолжить исполнение?

2 ответа

Решение

Решение вашей проблемы довольно простое. Просто используйте попробовать, поймать.

Для цикла, который вызывает функцию

for i=1:3
    a=randi([0 500]);
    try
        myfunction(a); %Statements that may throw an error
    catch
        %Code that is executed if myfunction throws error
    end
    disp(i) %Proves that the loop continuous if myfunction throws an error
end

функция

function b = myfunction(a)
    b=a;
    error('Error!!!') %Function throws error every time it gets called
end

Вывод без попытки, лови

Error using myfunction (line 3)
Error!!!

Error in For_Error (line 6)
    myfunction(a); %Statements that may throw an error

Вывод с try, catch

1

2

3

Я думаю, что Каспар не совсем отвечает на ваш вопрос, user3717023. В решении Kaspar итерация не повторяется, а просто пропускается (как при использовании continue).

Предложенное решение

Если вы хотите, чтобы MATLAB повторял итерацию до myfunction() успешно завершено использование while, Посмотрите на это это:

for ii = 1:30
   disp(ii)

   out = 0;
   while(~out)
       disp('Attempt ...')

       try
           out = myfunction(some_arguments);
       catch
           disp('F****ck!')
       end

       pause(1)
   end

   disp('OK !')           
end

Если myfunction возвращает свой вывод (что произойдет, если не было ошибки), он завершает while петля. Линии с disp добавлено для информативности.

Линия с pause добавлен для аккуратного вывода при запуске примера.

пример

Выполните код выше с приведенным ниже примером myfunction() чтобы проверить, как работает это решение:

function out = myfunction(x)    
    a = randi(2,1,1) - 1;   % a = 0 or a = 1
    if a==0
        error
    else
        out = magic(3);
    end
end

Пример вывода:

ii =

     1

Attempt ...
F****ck!
Attempt ...
OK !

ii =

     2

Attempt ...
OK !

ii =

     3

Attempt ...
F****ck!
Attempt ...
F****ck!
Attempt ...
F****ck!
Attempt ...
F****ck!
Attempt ...
OK !
Другие вопросы по тегам