Exceção de sistema ou exceção de aplicativo
Pergunta
Estou confuso com um ponto vago na definição e no possível impacto da Application Exceptions
e System Exceptions
em EJB
.Em particular, não consigo descobrir se a exceção foi definida como:
public class SomeException extends Exception{
...
}
vai ser um Application
ou System Exception
.De acordo com a especificação um Application Exception
deve sempre ser definido com a anotação @ApplicationException
.Infiro portanto que a classe acima não é uma Application Exception
mesmo que seja uma exceção verificada.Minhas perguntas dizem respeito à sintaxe correta do Java e, posteriormente, ao comportamento do EJB Container
caso isso Exception
deve ser lançado dentro de um método de negócios de um Session Bean
(não Singleton
no entanto):
@Stateless
@LocalBean
public class StatelessBean{
public void doStuff(){
throw new SomeException();
}
}
1) Deve o SomeException
ser declarado na cláusula throw?
2) O Container
descarta a instância após o método doStuff()
é chamado?
3) Se for finalmente um Sytem Exception
minha suposição está correta, que um System Exception
poderia ser verificado e não RuntimeException
?
Atualizar:
Na minha opinião, não está definitivamente claro, de acordo com as especificações, que uma exceção verificada deve sempre ser um Application Exception
.E se alguém definisse um verificado RuntimeException
?Deveria ser incluído em throw
de um método?É um System
ou Application Exception
?
public class SomeException extends RuntimeException{
...
}
Solução
A especificação diz:
As exceções de aplicativo que são exceções verificadas podem ser definidas como tal sendo listadas nas cláusulas throws dos métodos da interface de negócios do bean, visualização sem interface, interface inicial, interface de componente e terminal de serviço da web.Uma exceção de aplicativo que é uma exceção não verificada é definida como uma exceção de aplicativo anotando-a com a anotação de metadados ApplicationException ou denotando-a no descritor de implantação com o elemento application-exception.
Portanto, a classe acima é uma exceção Application, pois é uma exceção verificada.E é claro que deve estar listado na cláusula throws do seu método, caso contrário o código não será compilado.E não, a instância do bean não será descartada após esta exceção ser lançada, conforme a especificação.