demoiselle/internal — Issue #3: Localização de método para tratamento de exceção: Tratamento para superclasses
Author: juliogalvaofilho
Created: 2012-03-01 13:27:45+00:00
State: open

Atualmente o framework seleciona o método para tratamento de exception (anotado com @ExceptionHandler) pelo nome da classe da exception, considerando apenas seu nível na hierarquia.
Por exemplo, se eu tiver o seguinte handler:

@br.gov.frameworkdemoiselle.exception.ExceptionHandler
public void exceptionHandler(Exception e) {
//impl
}

A única exceção tratata será Exception, sem considerar suas subclasses. Se eu quiser tratar uma NullPointerException, por exemplo, teria que escrever outro método específico.

Sugiro que seja alterada a implementação da busca do método para tratamento de exceção, considerando não apenas o método que trata a classe da exception, mas também suas superclasses.
Segue sugestão de implementação, na classe ExceptionHandlerInterceptor, alterando o método getMethod:

private final Method getMethod(final Class type, final Class exceptionClass) {
if (!cache.containsKey(type) || exceptionClass == null) {
return null;
} else if (cache.get(type).containsKey(exceptionClass)) {
return cache.get(type).get(exceptionClass);
} else {
return getMethod(type, exceptionClass.getSuperclass());
}
}

Dessa forma, se não for encontrado um handler específico para a exceção lançada, será utilizado o primeiro handler de sua hierarquia de superclasses, em abordagem bottom-up.