2012-04-13 2 views
0

J'ai une boucle qui s'exécute plusieurs fois et qui est sujette à des exceptions (elle est basée sur le Web). Cependant, je ne veux rien lancer directement de la méthode car je veux qu'elle bouge à l'itération suivante en cas d'erreur. Donc ce que j'ai fait, c'est que j'ai ajouté un paramètre de référence que l'appelant passe, et toutes les exceptions sont mises là.Accès à l'objet interne

Je veux retourner à l'utilisateur l'exception ainsi que l'URL de défaut, donc je créé l'objet suivant:

class KeywordException 
{ 
    Exception ex; 
    string faultURL; 
} 

Il est retourné à l'utilisateur comme ref List<KeywordException> exceptions

Ok, il est tout bon jusqu'à présent, et je prends des exceptions comme ceci:

catch (ArgumentNullException ane) 
{ 
    exceptions.Add(new KeywordException(ane, URL)); 
    continue; 
} 

Il fonctionne et l'exception est retournée à l'utilisateur, mais comment puis-je du code appelant savoir ce que l'exception fait était? Tout ce que je reçois est Exception quand il s'agit en fait d'un ArgumentNullException dans ce cas.

+2

Pourquoi KeyWordException hérite-t-il d'Exception? – MPelletier

Répondre

1

Le problème est que votre classe KeywordException stocke l'exception comme une exception (qui fait sens et est probablement correct).

Pourquoi voulez-vous connaître le type exact d'exception? Est-ce pour afficher un message à l'utilisateur? Dans ce cas, vous pouvez utiliser la réflexion pour obtenir le type concret de la variable ex:

string exceptionType = keywordException.ex.GetType().Name; 
+0

Puis-je l'utiliser pour obtenir l'exception complète? Quelque chose comme 'var exception = keywordException.ex.GetType();'? – TheGateKeeper

+1

Non cela vous donne l'objet Type. Vous avez déjà la pleine exception dans l'ex vairable. Il est simplement converti en Exception et doit être renvoyé au type réel. Voir mon commentaire dans la réponse ci-dessus .. Vous devez créer votre propre classe que vous revenez à l'utilisateur. Cette classe doit décrire le résultat plutôt que de passer des exceptions et attendre que l'utilisateur sache quoi faire avec. – Martyn

+0

Vous avez raison, je vais créer ma propre exception. C'est beaucoup plus facile et fonctionnera mieux pour l'utilisateur. – TheGateKeeper

1

Vous pouvez voir la propriété InnerException - elle existe à chaque exception.

Cette information serait également sur la trace de pile de l'exception.

L'un des constructeurs de Exception prend un Exception - si vous l'utilisez, le InnerException sera défini sur l'exception transmise.

+0

donc Exception ex = new SomeOtherException provoque l'exception interne d'ex à SomeOtherException? – TheGateKeeper

+0

@TheGateKeeper - Seulement si vous transmettez l'exception réelle au constructeur. – Oded

+1

@TheGateKeeper: Votre classe 'KeywordException' * provient-elle réellement de' Exception'? Si non, je soupçonne que «InnerException» est un hareng rouge ici. Si vous le faites, veuillez mettre à jour votre question avec un exemple plus précis - et dites aussi ce que vous essayez de faire avec les exceptions. –

1

Même si est juste Exception, le type compilation temps de KeywordException.ex lorsque vous vous connectez, il vous verrez l'objet réel. Vous pourrait test pour les types spécifiques en utilisant:

if (keywordException.ex is ArgumentNullException) 

mais je doute que vous voulez faire. Vous devriez être bien d'enregistrer l'exception inconditionnellement - ou l'afficher à l'utilisateur sous la forme que vous voulez.

EDIT: Vous pouvez appeler GetType() à l'exception pour obtenir son type aussi, bien sûr:

Type exceptionType = keywordException.ex.GetType(); 

... mais il est toujours pas clair pourquoi vous voulez traiter certaines exceptions différemment aux autres.

EDIT: Si vous devez utiliser les informations spécifiques de type à l'exception, vous devez utiliser quelque chose comme:

WebException webException = keywordException.ex as WebException; 
if (webException != null) 
{ 
    // Use webException here 
} 
+0

Je pense que je devrais utiliser le 'est 'pour cela, je ne vois pas d'autre moyen de savoir ce que l'exception était réellement du code appelant. – TheGateKeeper

+0

@TheGateKeeper: Pourquoi avez-vous * besoin * de savoir? Qu'est-ce que vous essayez de * faire * avec l'exception? –

+0

Je dois savoir car certaines exceptions ont des détails spécifiques que je dois utiliser. Je serais bien d'utiliser le générique 'Exception.Message' dans la plupart des cas, mais dans le cas de' WebException', j'ai besoin de connaître la valeur de 'WebException.Status' pour montrer l'erreur réelle à l'utilisateur. – TheGateKeeper

Questions connexes