OVH Cloud OVH Cloud

refllection et Exception

2 réponses
Avatar
Karl
Bonjour,
surune application j'utilise une exception applicative
(clsApplicationException qui hérite de ApplicationException) pour gérer
certaines erreurs de l'application. Dans la plupart des cas tout fonctionne
commme prévu, je fais un throw de cette clsApplicationException et je peux la
trapper dans la méthode appelante via un catch(clsApplicationException)

Cependant lorsque la méthode renvoyant l'ApplicationException est appelé via
la reflection, je ne récupére plus l'applicationException. Celle-ci est
encapsulé dans une exception de type
System.Reflection.TargetInvocationException. L'applicationException qui a été
levée est elle accessible via la propriété Innerexception.

Voici un exemple du code:
public class ClasseA {
public static void InvokeMethod( object oObject, string sMethod, object[]
oParam)
{
try
{

Type _type = oObject.GetType();
MethodInfo _method = _type.GetMethod(sMethod);
object _retour = new Object();

//invoque la methode sur l'objet.
if (_method != null )
{
_retour = _method.Invoke(oObject, oparam);
}

return _retour;
}
catch (clsApplicationException ex)
{
throw new clsApplicationException ("Erreur", ex, ex.CodeErreur);
}
catch (Exception ex)
{
throw ex;
}
}

Bien que l'application levée dans la méthode invoquée lors du
_method.Invoke(oObject, oparam) soit de type clsApplicationException elle
n'est pas trappé car c'est une System.Reflection.TargetInvocationException
qui est retournée. Pourquoi ce comportement ? Il n'y a aucun catch qui
explique que ce ne soit pas direct-ement la clsApplicationException qui ne
soit pas retourné. Pour le moment je test la propriété innerexception pour
savoir si une clsAppllicationException a été levé mais si dans certains cas
l'exception applicative est encapsulé plus profondement....
Ceci me pose pas mal de problème car j'ai vraiment besoin de ramener des
informations contenue dans l'exception applicative

Merci beaucoup de votre aide

2 réponses

Avatar
Paul Bacelar
C'est ByDesign ;-)



Toutes les exceptions non létal envoyées par des composants sont catchées
par les méthodes de réflexion pour permettre une gestion élégante des
plug-ins et autres design patterns via des types de.

Si tu veux gérer spécifiquement un type d'exception et que cette exception
passe par de la réflexion, il suffit de catcher les exceptions de la couche
réflexion (pour un invoke "TargetInvocationException" devrait suffire) et de
tester le type de la InnerException. En cas de mauvais type de
InnerException, le throw sans paramètre permet de laisser monter l'exception
originale.

Si vous implémentez vous même une couche qui doit abstraire le caractère
réflexif de vos appels, un throw de la InnerException dans le catch vous
permet de cacher l'utilisation de la réflexion.
--
Paul Bacelar


"Karl" wrote in message
news:
Bonjour,
surune application j'utilise une exception applicative
(clsApplicationException qui hérite de ApplicationException) pour gérer
certaines erreurs de l'application. Dans la plupart des cas tout


fonctionne
commme prévu, je fais un throw de cette clsApplicationException et je peux


la
trapper dans la méthode appelante via un catch(clsApplicationException)

Cependant lorsque la méthode renvoyant l'ApplicationException est appelé


via
la reflection, je ne récupére plus l'applicationException. Celle-ci est
encapsulé dans une exception de type
System.Reflection.TargetInvocationException. L'applicationException qui a


été
levée est elle accessible via la propriété Innerexception.

Voici un exemple du code:
public class ClasseA {
public static void InvokeMethod( object oObject, string sMethod, object[]
oParam)
{
try
{

Type _type = oObject.GetType();
MethodInfo _method = _type.GetMethod(sMethod);
object _retour = new Object();

//invoque la methode sur l'objet.
if (_method != null )
{
_retour = _method.Invoke(oObject, oparam);
}

return _retour;
}
catch (clsApplicationException ex)
{
throw new clsApplicationException ("Erreur", ex, ex.CodeErreur);
}
catch (Exception ex)
{
throw ex;
}
}

Bien que l'application levée dans la méthode invoquée lors du
_method.Invoke(oObject, oparam) soit de type clsApplicationException elle
n'est pas trappé car c'est une System.Reflection.TargetInvocationException
qui est retournée. Pourquoi ce comportement ? Il n'y a aucun catch qui
explique que ce ne soit pas direct-ement la clsApplicationException qui ne
soit pas retourné. Pour le moment je test la propriété innerexception pour
savoir si une clsAppllicationException a été levé mais si dans certains


cas
l'exception applicative est encapsulé plus profondement....
Ceci me pose pas mal de problème car j'ai vraiment besoin de ramener des
informations contenue dans l'exception applicative

Merci beaucoup de votre aide







Avatar
Karl
Merci c'est en effet ce que je fais actuellement

:
public class ClasseA {
public static void InvokeMethod( object oObject, string sMethod, object[]
oParam)
{
try
{

Type _type = oObject.GetType();
MethodInfo _method = _type.GetMethod(sMethod);
object _retour = new Object();

//invoque la methode sur l'objet.
if (_method != null )
{
_retour = _method.Invoke(oObject, oparam);
}

return _retour;
}
catch (ApplicativeExceptionex)
{
throw new ApplicativeException("Erreur", ex, ex.CodeErreur);
}
catch (Exception ex)
{
if (ex.InnerException.GetType().Name.Equals("ApplicativeException"))
throw new ApplicativeException("Erreur lors de l'utilisation du reflecter",
ex, ((ApplicativeException)ex.InnerException).CodeErreur);
else
throw ex;
}
}


Je voulais être sur de ce mécanisme afin d'atre sur que mon exception
applicative sera bien toujours accessible via InnerException.


"Paul Bacelar" wrote:

C'est ByDesign ;-)



Toutes les exceptions non létal envoyées par des composants sont catchées
par les méthodes de réflexion pour permettre une gestion élégante des
plug-ins et autres design patterns via des types de.

Si tu veux gérer spécifiquement un type d'exception et que cette exception
passe par de la réflexion, il suffit de catcher les exceptions de la couche
réflexion (pour un invoke "TargetInvocationException" devrait suffire) et de
tester le type de la InnerException. En cas de mauvais type de
InnerException, le throw sans paramètre permet de laisser monter l'exception
originale.

Si vous implémentez vous même une couche qui doit abstraire le caractère
réflexif de vos appels, un throw de la InnerException dans le catch vous
permet de cacher l'utilisation de la réflexion.
--
Paul Bacelar


"Karl" wrote in message
news:
> Bonjour,
> surune application j'utilise une exception applicative
> (clsApplicationException qui hérite de ApplicationException) pour gérer
> certaines erreurs de l'application. Dans la plupart des cas tout
fonctionne
> commme prévu, je fais un throw de cette clsApplicationException et je peux
la
> trapper dans la méthode appelante via un catch(clsApplicationException)
>
> Cependant lorsque la méthode renvoyant l'ApplicationException est appelé
via
> la reflection, je ne récupére plus l'applicationException. Celle-ci est
> encapsulé dans une exception de type
> System.Reflection.TargetInvocationException. L'applicationException qui a
été
> levée est elle accessible via la propriété Innerexception.
>
> Voici un exemple du code:
> public class ClasseA {
> public static void InvokeMethod( object oObject, string sMethod, object[]
> oParam)
> {
> try
> {
>
> Type _type = oObject.GetType();
> MethodInfo _method = _type.GetMethod(sMethod);
> object _retour = new Object();
>
> //invoque la methode sur l'objet.
> if (_method != null )
> {
> _retour = _method.Invoke(oObject, oparam);
> }
>
> return _retour;
> }
> catch (clsApplicationException ex)
> {
> throw new clsApplicationException ("Erreur", ex, ex.CodeErreur);
> }
> catch (Exception ex)
> {
> throw ex;
> }
> }
>
> Bien que l'application levée dans la méthode invoquée lors du
> _method.Invoke(oObject, oparam) soit de type clsApplicationException elle
> n'est pas trappé car c'est une System.Reflection.TargetInvocationException
> qui est retournée. Pourquoi ce comportement ? Il n'y a aucun catch qui
> explique que ce ne soit pas direct-ement la clsApplicationException qui ne
> soit pas retourné. Pour le moment je test la propriété innerexception pour
> savoir si une clsAppllicationException a été levé mais si dans certains
cas
> l'exception applicative est encapsulé plus profondement....
> Ceci me pose pas mal de problème car j'ai vraiment besoin de ramener des
> informations contenue dans l'exception applicative
>
> Merci beaucoup de votre aide
>
>
>
>
>