InvocationTargetException doit-on désencapsuler la cause ?

InvocationTargetException doit-on désencapsuler la cause ? - Java - Programmation

Marsh Posté le 05-01-2004 à 12:23:43    

voiloù le code d'un proxy typique :
 

Code :
  1. class ProxyInutile implements InvocationHandler {
  2.   private Object sujet;
  3.   public ProxyInutile(Object sujet) {
  4.     this.sujet = sujet;
  5.   }
  6.   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  7.     method.invoke(sujet, args);
  8.   }
  9. }
  10. ...
  11. ArrayList monObj = new ArrayList();
  12. ArrayList proxy = (ArrayList)Proxy.newProxyInstance(
  13.   ArrayList.class.getClassLoader(),
  14.   new Class[] { ArrayList.class },
  15.   new ProxyInutile(monObj));
  16. monObj.get(-12); // ça va planter chérie !
  17. ...


la dernière ligne de code ne renvoie non pas un IndexOutOfBoundsException comme on pourrait le croire naïvement, mais un InvocationTargetException, avec la cause kivabien, soit le IndexOutOfBoundsException tant attendu, comme marqué dans la doc de invoke().
 
La question est : il est très tentant de modifier le handler comme suit

Code :
  1. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  2.     try {
  3.       method.invoke(sujet, args);
  4.     } catch (InvocationTargetException e) {
  5.       throw e.getCause();
  6.     }
  7.   }

C'est une bonne idée ou un piège à con ?
Si c'est un piège à con, où est le problème ?
Si c'est est pas un, pourquoi ça n'a pas été fait dans Method.invoke() directement ? pour ne pas fausser le point d'origine de l'exception ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 05-01-2004 à 12:23:43   

Reply

Marsh Posté le 05-01-2004 à 14:18:17    

c'est la bonne chose à faire. D'ailleurs, si tu ne le fais pas, tu n'es plus conforme à la javadoc du InvocationHandler.
 
disons que méthod.invoke() est explicitement de l'invocation dynamique => il est logique qu'en cas d'erreur, l'exception soit une exception d'invocation.  
Par contre, pour le proxy, ce n'est plus vrai : il est plus logique que l'exception source soit retournée puisque l'invocation dynamique intermédiaire doit être transparente.
 
D'ailleur, le fait de faire un e.getCause() est logique puisque InvocationException est explicitement un wrapper :  

Citation :

InvocationTargetException is a checked exception that wraps an exception thrown by an invoked method or constructor.  


Message édité par benou le 05-01-2004 à 14:18:29

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2004 à 15:28:42    

ok, merci.


---------------
trainoo.com, c'est fini
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed