| Author |
Message |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/01/2007 17:43:51
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/01/2007 18:23:20
|
afsrj
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/01/2007 18:36:36
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/01/2007 18:54:59
|
RubemAzenha
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/01/2007 19:40:28
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/01/2007 20:00:19
|
afsrj
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/01/2007 20:28:55
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/01/2007 20:36:08
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/01/2007 12:16:24
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/01/2007 12:20:42
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/01/2007 12:45:24
|
afsrj
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/01/2007 20:29:49
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/01/2007 09:54:22
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/01/2007 12:04:49
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/01/2007 12:47:18
|
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 |
|
|
 |
|
|