Pourquoi est-TargetInvocationException traités comme des non interceptée par l'IDE?
J'ai un code qui utilise la réflexion pour tirer les valeurs des propriétés d'un objet. Dans certains cas, les propriétés peuvent lever des exceptions, parce qu'ils ont des références nulles, etc.
object result;
try
{
result = propertyInfo.GetValue(target, null);
}
catch (TargetInvocationException ex)
{
result = ex.InnerException.Message;
}
catch (Exception ex)
{
result = ex.Message;
}
En fin de compte que le code fonctionne correctement, mais quand je suis en cours d'exécution sous le débogueur:
Lorsque la propriété déclenche une exception, l'IDE gouttes dans le débogueur comme si l'exception a été interceptée. Si je viens frapper terme, le programme des flux de à travers et à l'exception vient comme un TargetInvocationException avec la véritable exception dans la propriété InnerException.
Comment puis-je empêcher cela?
InformationsquelleAutor Jason Coyne | 2010-04-17
Vous devez vous connecter pour publier un commentaire.
Ce qui semble être "by design". Ce qui se passe est que vous avez probablement menu Outils → Options → de Débogage → Général → Activer uniquement Mon Code activé.
Comme Comment: Pause sur l'Utilisateur, les Exceptions Non gérées états:
La Debug → Exceptions boîte de dialogue affiche une colonne supplémentaire (Pause lorsqu'une exception est l'Utilisateur non gérée) lorsque l'option "Activer uniquement Mon Code" est sur les.
Essentiellement, cela signifie que chaque fois que l'exception est en dépassant les limites de votre code (et dans ce cas, il tombe dans le bas de la .NET framework code de réflexion), Visual Studio pauses car il pense que l'exception a quitté le code de l'utilisateur. Il ne sait pas qu'il sera de retour dans le code de l'utilisateur dans la pile.
Il y a donc deux solutions: Désactiver Juste Mon Code dans le menu Outils → Options → de Débogage → Général ou Supprimer la case à cocher de l'Utilisateur-non gérée .NET Framework exceptions dans le menu Debug → Exceptions boîte de dialogue.
EDIT: j'ai juste essayé moi-même, et il semble que la réflexion est traité un peu différemment. Vous pourriez penser à un appel de réflexion que de commencer un nouveau niveau de "manipulés" aussi loin que le débogueur est concerné: rien n'est intercepter cette erreur avant qu'il soit traduit et renvoyé comme un
TargetInvocationException
, donc il se casse en. Je ne sais pas si il y a un moyen d'inhiber, mais il arrive très souvent? Si vous êtes régulièrement effectuer beaucoup d'opérations qui entraînent des exceptions, vous pourriez vouloir reconsidérer votre conception.Réponse originale à cette question
Aller Debug /Exceptions... et voir ce que les paramètres sont. Vous verrez ce comportement si
TargetInvocationException
(ou quelque chose de plus élevé dans la hiérarchie) a la "Levée" une case à cocher activée.catch(Exception)
n'est pas en disant "je veux attraper toutes les exceptions lancées par la réflexion" - leTargetInvocationException
est déjà ce que. Le point est que vous n'obtenez pas de dire, "je veux attraper IOException" lorsque vous utilisez la réflexion; vous avez juste à attraper tout en utilisantTargetInvocationException
.MethodInfo
invocateur (qui est appelée à partirPropertyInfo.GetProperty()
traduit le réel de la levée d'une exception dans un TargetInvocationException. Si vous n'êtes pas de la manipulation de la vraie exception, vous êtes la manipulation de l'enveloppé exception. La vraie exception (qui est maintenant enveloppé dansTargetInvocationException
) a été non gérée.