demoiselle / framework

Repositório principal contendo o Core e Extensions: JPA, Security, WS
https://demoiselle.org
127 stars 77 forks source link

Localização de método para tratamento de exceção: Tratamento para superclasses #10

Closed juliogalvaofilho closed 11 years ago

juliogalvaofilho commented 12 years ago

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.

zyc commented 11 years ago

Olá, faz um tempo recebemos uma contribuição referente a este mesmo assunto. Acabamos de integrá-la ao ramo 2.4.0.