我在MATLAB中有这个代码:
for i = 1: n
a = randi([0 500]);
function (a);
end
如果在迭代function(a)
执行i=k
期间出错,程序将停止。有没有办法让程序重复相同的迭代(当出现错误时),使用新值a
并继续执行?
答案 0 :(得分:2)
您的问题的解决方案非常简单。只需使用try, catch。
用于调用函数的循环
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
答案 1 :(得分:1)
我认为Kaspar的答案并没有完全回答你的问题,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 !