Tratamento de exceções dentro de laços

Gostaria de implementar um laço de tal modo que meu programa só saia dele quando determinada exceção deixar de ser capturada.

Por exemplo, num programa em modo texto que lê entradas do teclado, eu gostaria de implementar um laço de tal modo que, enquanto o usuário não digitar o formato certo de entrada (por exemplo, uma string quando deveria digitar um número inteiro), meu programa, ao capturar a exceção correspondente, permaneça no laço, solicitando ao usuário digitar aquele valor novamente.

Eu pensei em algo assim:

[code]boolean prosseguir = false;

while ( !prosseguir )
{
try
{
instrucaoQueLancaMinhaExcecao();
prosseguir = true;
}
catch ( MinhaExcecao e )
{
puxarAOrelhaDoUsuario();
continue;
}
}[/code]

Existe algum modo melhor de se fazer isto?

Parece ok.

Rafael

O problema vai ser se a operação nunca for executada corretamente.
Suponha que esta operação acesse algum recurso externo (sei lá, um webservice, talvez) e que este recurso esteja indisponível durante o uso da aplicação. O que vai acontecer? Parabéns, você terá um loop infinito :slight_smile:
Coloque um contador, é um pouco melhor.

int attempt = 0; boolean alrite = false; while((attempt < 10) || (!alrite)){ try{ aquelaOperacaoMalaQuePodeLancarUmaExcecao(); alrite = true; }catch(AlgumaException ae){ chutaOBalde(); attempt++; } }

Depende do caso. No primeiro post, o cara disse que estaria lendo input do usuario, e nao fazendo chamadas remotas.

[editado]ok, agora li o “SE nunca for executada corretamente”.[/editado]

Rafael

Eu não havia pensado na idéia de colocar um contador (talvez por não ser o caso, no meu exemplo) mas, de qualquer modo, obrigado pela dica (esta vai para o meu livro de memórias :D).