Qual é a necessidade de outras classs de exceção quando a class Exception sozinha pode manipular todo o tipo de exceções?

Em uma das minhas entrevistas, o entrevistador me fez uma pergunta sobre vários bloqueios de catch . A pergunta era: Por que precisamos de outras classs filho de Exception para manipular a exceção, se a class pai, ou seja, Exception , sozinha puder manipular todas as outras exceções.

Existem diferentes vantagens de usar subclasss autodeclaradas de Exception ou RuntimeException:

  • Você pode adicionar informações adicionais (Campos) à sua Exceção que você entrega ao seu registro. Isso pode ser útil para rastrear seus bugs com mais facilidade ou fornecer mais algumas informações ao usuário que ele pode fornecer se o aplicativo dele estiver em falha
  • Você pode distinguir razões de erro diferentes com mais facilidade e assim decidir como resolver situações erradas diferentes (por exemplo, você poderia usar uma IllegalArgumentException se algum argumento typescript estiver errado, então você poderia solicitar ao usuário que insira um argumento válido; Por outro lado, uma IOException mostra que você não sabia ler / gravar seus dados

Cito o tutorial básico do Oracle

“Na maioria das situações, no entanto, você deseja que os manipuladores de exceção sejam os mais específicos possíveis. O motivo é que a primeira coisa que um manipulador deve fazer é determinar que tipo de exceção ocorreu antes de decidir sobre a melhor estratégia de recuperação . não pegando erros específicos, o manipulador deve acomodar qualquer possibilidade. Os manipuladores de exceção que são muito genéricos podem tornar o código mais propenso a erros, capturando e manipulando exceções que não foram previstas pelo programador e para as quais o manipulador não foi planejado. ”

Veja aqui o texto completo: http://docs.oracle.com/javase/tutorial/essential/exceptions/advantages.html

Usamos as subclasss de exceção, como

 FileNotFoundException 

para que possamos exibir uma mensagem adequada.

Se usássemos apenas uma exceção, quando um aplicativo lançasse uma exceção, não saberíamos qual é a exceção.

Isso não seria muito bom para debugging. Usando as classs filho também nos ajuda a registrar melhor as exceções.

Porque nós podemos lidar com diferentes exceções de maneira diferente, como:

 catch (FileNotFoundException e){ createNewFile(); } catch (IOException e){ System.out.println("Everything is bad("); }