Ordem das Exceptions

oi pessoal

em meu projeto eu tenho alguns try/catch que sem eu perceber acabaram ficando “aninhados”. Conheço a regra correspondência de excessões, que IOException não pode ser tratada antes de uma FileNotFoundException, por IOE… ser mais abrangente. A regra diz que primeiro trato File… e depois se precisar IOE…

Minha dúvida é porque como disse os try´s ficaram aninhados a medida que fui adicionando código e no final ficou assim:

try // fnfe
{
   iaLog = new BufferedReader(new FileReader("C:/Log.txt"));
   try // ioe
   {
      while ((iaAudit = iaLog.readLine()) != null) 
      {
      //um montão de coisas aqui no meio
      }
   } 
   catch (IOException ioe) 
   {
      ioe.printStackTrace();
   }
} 
catch (FileNotFoundException fnfe) 
{
   fnfe.printStackTrace();
}

Como pode ver tem um try/catch que trata da FNFE e dentro deste try tem outro try que trata da IOE.
Funciona, mas é correto fazer isso do ponto de vista de boas práticas de programação? Eu sei o que o código faz e porque faz, mas alguém que não conhece, vai achar estranho e ficar perdido por causa disso?

Outra pergunta. Como eu estou me preparando para a scjp6, isso pode cair na prova? o que eu responderia? vale, não vale?

valeu

eu deixaria o meu código assim

[code] try
{
iaLog = new BufferedReader(new FileReader(“C:/Log.txt”));

      while ((iaAudit = iaLog.readLine()) != null)   
      {  
      //um montão de coisas aqui no meio  
      }  

}
catch (Exception e) {
e.printStackTrace();
} [/code]

o que ele pegar ele vai log no console tanto se for IOException ou FileNotFoundException

rsrsrsrsrsrsrs

[quote=java es a lei]eu deixaria o meu código assim

[code] try
{
iaLog = new BufferedReader(new FileReader(“C:/Log.txt”));

      while ((iaAudit = iaLog.readLine()) != null)   
      {  
      //um montão de coisas aqui no meio  
      }  

}
catch (Exception e) {
e.printStackTrace();
} [/code]

o que ele pegar ele vai log no console tanto se for IOException ou FileNotFoundException

rsrsrsrsrsrsrs [/quote]

Também vai pegar qualquer outro erro que você não queria que pegasse.

Valer vale hehehe, a SCJP vai testar se você sabe o que está acontecendo no código e se você ver um código assim vai saber que a FNFE se refere ao código new FileReader(…
E a IO se refere ao readLine.

Agora sua dúvida quando a padrões eu acho que ficou meio estranho… Vendo seu comentário //um montão de coisas aqui no meio, eu acho que o new FileReader vai ficar muito perdido lá em cima… O que você pode fazer é colocar o catch de FNFE antes do segundo try, ou então aninhar os catchs em um só try, lembrando de manter hierarquia…

Acho a segunda opção bem melhor, olha como ficariam os códigos:

try {
   iaLog = new BufferedReader(new FileReader("C:/Log.txt"));
} catch (FileNotFoundException fnfe) {
     fnfe.printStackTrace();
}
try {
   while ((iaAudit = iaLog.readLine()) != null) {
   //um montão de coisas aqui no meio
   }
}  catch (IOException ioe)   {
      ioe.printStackTrace();
}

ou

try {
   iaLog = new BufferedReader(new FileReader("C:/Log.txt"));
   while ((iaAudit = iaLog.readLine()) != null) {
   //um montão de coisas aqui no meio
   }
}  catch (FileNotFoundException fnfe) {
      fnfe.printStackTrace();
}  catch (IOException ioe)   {
      ioe.printStackTrace();
}

O que mais cai na SCJP é saber se o programa compila se os exceptions forem colocados nesta ordem

try {
   iaLog = new BufferedReader(new FileReader("C:/Log.txt"));
   while ((iaAudit = iaLog.readLine()) != null) {
   //um montão de coisas aqui no meio
   }

} catch (IOException ioe)   {
      ioe.printStackTrace();

} catch (FileNotFoundException fnfe) {
      fnfe.printStackTrace();
}

Não compila pois IOException é uma exceção mais genérica que FileNotFoundException, nunca cairia no segundo. A ordem é sempre da exceção mais específica para a mais genérica.

valeu pelas dicas

Porém minha questão é que quando tinha os try/catch aninhados cada try trataria de sua exceção no catch correspondente. A primeira sugestão do Bruno é excelente porque cada trecho de código teria um try/catch proprio porém não atende o que eu preciso fazer. Pelo fato de serem muitos ficaria poluído o código com try/catch vazando pelo ladrão.

Fiz as mudanças sugeridas por vocês e ai ficou assim, um monte de catch tratando de várias exceções.

Pelo que entendi do que vocês comentaram, esta seria a melhor maneira quando tenho tantas possibilidades de erro.

try { //........... } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } catch (SQLException sqle) { sqle.printStackTrace(); } catch (InstantiationException ie) { ie.printStackTrace(); } catch (MalformedURLException mue) { mue.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } catch (AgletException ae) { ae.printStackTrace(); }