[Logo] Mentawai Forum - Mentawai Web Framework
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 
Não substituir as exceções  XML
Forum Index -> Comentários Gerais Go to Page: 1, 2 Next 
Author Message
bruno.braga



Joined: 01/12/2006 09:37:16
Messages: 226
Offline

Quando da um erro em qualquer lugar do programa, ao inves de abrir a página com a exceção real, ela é substituida por uma java.lang.reflect.InvocationTargetException.

Isso dificulta o desenvolvimento, porque a tela só registra o ultimo caused by (que é o do InvocationTargetException).
Para saber o problema ou a pessoa tem que debugar ou abrir os logs (log4j, log tomcat, etc) e sair procurando o problema lá. Da mais trabalho.

Deixa subir a exceção real, isso não mata ninguém, nem mascara nada =)

http://www.brunobraga.com.br
http://www.j2eespider.org
[WWW]
afsrj


[Avatar]
Joined: 16/11/2006 19:28:15
Messages: 469
Location: Rio de Janeiro
Offline

Já tinha falado isso para alguns aqui...

Isso ajudaria muito !


Alexandre Ferreira
Blog: http://alexandreferreira.com.br
[Email] [WWW] [MSN]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline


Dá um exemplo disso, Bruno.

O Mentawai usa muito reflection, por isso disso.

Dá um exemplo aí para eu ver se tem como melhorar.

Sergio Oliveira

RubemAzenha


[Avatar]
Joined: 30/06/2005 23:12:02
Messages: 472
Location: São Paulo, SP
Offline

Da para fazer um teste


Code:
 if (exception instanceof InvocationTargetException) {
    if (e.getCause() != null) {
        throw e.getCause();
    }
 }
 throw e;
 


Eu tinha esquecido disso :/


Mentawai Developer
[WWW] [MSN]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline


Seguindo a dica do Rubem, modifiquei o Controller para jogar a getCause().

Peguem do beta e testem para ver se ficou melhor!


Sergio Oliveira

afsrj


[Avatar]
Joined: 16/11/2006 19:28:15
Messages: 469
Location: Rio de Janeiro
Offline

Aqui continua igual =/
Code:
 root cause
 
 org.mentawai.core.ActionException: java.lang.reflect.InvocationTargetException
 


SAOJ, é normal a cada update o tamanho do jar diminuir?

1.7 = 443kb
1.8 beta1 = 449kb
1.8 beta2 = 448kb
1.8 beta3(esse agora) = 447kb
 

So é um coisa que eu percebi


Alexandre Ferreira
Blog: http://alexandreferreira.com.br
[Email] [WWW] [MSN]
bruno.braga



Joined: 01/12/2006 09:37:16
Messages: 226
Offline

Não sei se isso funciona porque o primeiro cause é o próprio InvocationTargetException...

A exceção real é o(s) outro(s) Cause(s) para traz...

Mas não testei porque o Alexandre disse que testou...

Você deve ter que fazer e.getCause().getCause()...

http://www.brunobraga.com.br
http://www.j2eespider.org
[WWW]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline


Fiz esse método:

Code:
    private Throwable getRootCause(Throwable t) {
     	
     	Throwable curr = t;
     	
     	while(curr.getCause() != null) {
     		
     		curr = curr.getCause();
     		
     	}
     	
     	return curr;
     }
 


Testa agora ai !!!!

Sergio Oliveira

bruno.braga



Joined: 01/12/2006 09:37:16
Messages: 226
Offline

No meu teste com o beta jar ficou a mesma coisa de sempre... :/

http://www.brunobraga.com.br
http://www.j2eespider.org
[WWW]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline


Alguma outra idéia para resolver isso ???

Tem solução ???


Sergio Oliveira

afsrj


[Avatar]
Joined: 16/11/2006 19:28:15
Messages: 469
Location: Rio de Janeiro
Offline

Ai eu vi isso desda aquela madrugada. Mas como ja tinha reportado antes e ainda vejo isso todos os dias.
Pensei que o problema era so comigo. Mas desda aquela noite nada mudou!


Alexandre Ferreira
Blog: http://alexandreferreira.com.br
[Email] [WWW] [MSN]
bruno.braga



Joined: 01/12/2006 09:37:16
Messages: 226
Offline

amanha vou ver se debugo isso e vejo o problema...

http://www.brunobraga.com.br
http://www.j2eespider.org
[WWW]
bruno.braga



Joined: 01/12/2006 09:37:16
Messages: 226
Offline

O problema é que tá caindo no catch de baixo.

Se fizer a mesma coisa no catch (Exception e), funciona.

O InvocationTargetException existe, mas pelo que eu vi é o cause, mas a exceção real é ActionException, então ta sempre caindo no catch de baixo.

Resolvendo problema:
Code:
         } catch (InvocationTargetException e) {
 
             Throwable cause = getRootCause(e);
 
             throw new ServletException("Exception while invoking action "
                     + actionName + ": " + cause.getMessage()
                     , cause);
 
         } catch (Exception e) {
         	
         	Throwable cause = getRootCause(e);
 
             throw new ServletException("Exception while invoking action "
                     + actionName + ": " + cause.getMessage(), cause);
 


Alias, se o tratamento dos 2 catchs é igual (inclusive mensagem), podia deixar só o de baixo...

http://www.brunobraga.com.br
http://www.j2eespider.org
[WWW]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline


Boa observação, Bruno.

Compensa fazer isso para tudo ou só para ActionException então ?

Sergio

Sergio Oliveira

bruno.braga



Joined: 01/12/2006 09:37:16
Messages: 226
Offline

hmmm, pelo que eu vi nenhum dos dois compensa... Acho que o certo era criar uma Exception especifica para o problema. Veja o que eu pensei:

O problema só ocorre com innerAction, porque o execute não é chamado por reflection. Veja abaixo:

InvocationChain:
Code:
 		if (innerAction != null) {
 			Method m = getMethod(innerAction);
 			if (m != null) {
 				try {
 					result = (String) m.invoke(action, new Object[0]);
 				} catch(Exception e) {
 					throw new ActionException(e);
 				}
 			} else {
 				throw new ActionException("The inner action does not exist: " + innerAction);
 			}
 		} else {
 			result = action.execute();
 		}
 

Ai em cima, só o innerAction lança ActionException.
Porém se tratar o ActionException com aquela regra, vai atrapalhar essa exceção do controller:

Code:
        if (c == null) {
 
             throw new ActionException("Action has no consequence for result: "
                     + ac.getName() + " - " + result);
         }


Ou seja, o ActionException é usado tanto para erros nos innerActions (qualquer erro) quanto para problema quando não existe consequence.
E só queremos usar o getRootCause() nos problemas dos innerActions que não tem a ver com reflection.

Então como citei no começo acho que poderia ter uma exceção especifica para esse tipo de erro, e usar o getRootCause() só nela.

A chamada dos innerActions ficaria mais feia por causa dos catchs do reflection:
Code:
 				try {
 					result = (String) m.invoke(action, new Object[0]);
 					} catch (IllegalArgumentException e) {
 						throw new ActionException(e);
 					} catch (IllegalAccessException e) {
 						throw new ActionException(e);
 					} catch (InvocationTargetException e) {
 						throw new ActionException(e);
 					} catch (Exception e) {
 						throw new ActionCodeException(e);
 					}
 

mas teria uma exceção diferenciada para os erros de código, que depois seriam tratados com o getRootCause().

Outra opção mais simples é tratar somente as exceções do reflection, e deixar subir as outras (tirando o catch do Exception...), como acontece com o execute().... Nesse caso a exceção real deve subir até a tela (*deve*, não testei...)

http://www.brunobraga.com.br
http://www.j2eespider.org
[WWW]
 
Forum Index -> Comentários Gerais Go to Page: 1, 2 Next 
Go to:   
Powered by JForum 2.1.6 © JForum Team