2011-12-29 2 views
1

Я хотел бы повторить вызов функции в предложении исключения, как это:Рекурсивный вызов функции в предложении исключения

private int mTries = 0; 
private void myFunction() { 
    try { 
     // do something 
    } catch (Exception e) { 
     if (mTries ++ < MAX_TRIES; 
      myFunction(); 
     } 
    } 
} 

Мой вопрос, независимо от использования стека памяти, вызывая функцию рекурсивно в предложении поймать так же, как вызвать его в нормальном случае? Мне интересно, если это сработает, если мое приложение будет запущено на платформе Android.

private void anotherFunction(int i) { 
     if (i == 0) 
      return; 
     anotherFunction(i--); 
} 
+2

ДругойFunction (int i) выглядит отлично, так же, как вы не начинаете с i <0. О первом использовании обычно не рекомендуется использовать обработчики исключений в java для логики приложения, и он отсасывает представление. – keni

+0

Согласен с keni. Для меня это плохой запах кода. –

ответ

5

Почему бы не написать так?

private void myFunction(){ 
    int triesRemaining = MAX_TRIES; 
    while(triesRemaining-- > 0){ 
     try{ 
     // ... do stuff 
     return; 
     } 
     catch(Exception e){ 
     } 
    } 
    throw new Exception("too many failures"); 
} 

Однако, я серьезно рекомендую вам сузить пункт поймать, так что вы только поймать только те типы исключения, после которого вы хотите продолжить обработку.

0

Ваша вторая реализация всегда приведет к перекрытию стека. (Попробуйте передать значение, равное 1, оно не будет выполнено).

0

Мой вопрос, независимо от использования памяти стека, вызов функции рекурсивно в предложение catch так же, как вызов его в обычном случае?

Да, это точно так же.