2016-04-29 3 views
3

У меня есть этот код в MATLAB:Как повторить для итерации цикла в Matlab, если произошла ошибка

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

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

+1

Самый простой способ переписать 'function', чтобы он не вызывал ошибок. – beaker

+2

У вас нет. Другие варианты включают использование цикла while, с инкрементным счетчиком, основанного на успехе 'function' или [' try/catch'] (http://www.mathworks.com/help/matlab/ref/try.html) заявление. – excaza

ответ

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 

Выход с попыткой, поймать

1 

2 

3 
+1

Блок 'try/catch', который является этим неизбирательным, не является хорошей идеей. Я настоятельно рекомендую только поймать [конкретные ошибки] (http://www.mathworks.com/help/matlab/ref/error.html), как определено 'function', и реконструировать те, которые не совпадают. – excaza

+0

Я не понимаю, что мне следует вводить в строки 'catch' !!! ??? – user3288977

+0

'@ user3288977' Вам не нужно писать что-то в блок catch и в зависимости от приложения, которое может быть полностью в порядке. Трудно что-то предложить, не зная, что должен делать ваш код. Одна из возможностей - создать пользователю сообщение об ошибке, объясняющее причину исключения (см. [Try, catch documentation] (http://ch.mathworks.com/help/matlab/ref/try.html).)). –

0

Я думаю, что Каспар ответ не точно ответить на ваш вопрос, 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 ! 
Смежные вопросы