Как повторить итерацию цикла в 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 !