2010-06-16 14 views
4

Followup:The uncatchable exception, pt 2L'exception uncatchable

J'écris un moteur de liaison personnalisée; mon convertisseur est appelé avant que DataContext soit défini sur l'élément cible. Ceci en soi n'est pas un gros problème car il sera mis à jour lorsque DataContext reçoit finalement une valeur. Qu'est-ce est causant des problèmes est le NullReferenceException que je reçois en raison de DataContext étant nul, cela ne semble pas vouloir être intercepté.

Même si je tente d'attraper l'exception dans mon convertisseur de valeur:

try { 
    return ((MethodInfo)_member).Invoke(parameter, null); 
} catch { 
    return null; 
} 

Pour une raison quelconque le débogueur est encore à l'arrêt de ce point.

alt text http://i50.tinypic.com/2ewm6oo.png

(Ceci est sauvegardé dans la pile tracer un bit à l'endroit où le bloc de prise est - à l'exception réelle se produit à l'intérieur de la méthode de _Membre la partie impaire est le bloc de capture est grisé encore le point d'arrêt. Je ne pense pas que cela puisse être dû au fait que l'exception se produit dans un autre assemblage d'où il est intercepté (j'essaie de l'empaqueter dans une bibliothèque de classes réutilisable, et _member ci-dessus pointe vers une méthode dans l'ensemble de l'application). Si je lance ma petite application de test sans le débogueur, cela fonctionne très bien, mais mon application est un peu plus robuste et a une gestion générale des exceptions qui se déclenche à cause de cela. Je me demande s'il y a juste un attribut ou quelque chose (ou peut-être un paramètre de réflexion qui me manque?) Que je peux utiliser pour que l'exception soit attrapée comme elle est supposée le faire.

Mise à jour: Je suis assez sûr que cela doit être dû à la réflexion et à l'utilisation de MethodInfo.Invoke. Il semble que l'exception soit la première de "TargetInvocationException" avec une exception interne de NullReferenceException. Il semble que l'exception d'invocation se produit d'une façon ou d'une autre en dehors de la pile d'appel et n'est donc pas interceptée à l'intérieur. Je ne fais rien avec les threads, mais peut-être y a-t-il une sorte de "thread-shifting" implicite dans MethodInfo.Invoke?

Est-ce que quelqu'un a des idées sur comment je pourrais forcer cela à être attrapé, ou peut-être une autre façon d'invoquer une méthode à partir d'un nom de méthode qui n'aura pas ce problème? Je suis un peu perplexe.

+0

Est-ce que quelque chose change si vous capturez l'exception (par exemple, 'catch (Exception badness) {...}' au lieu de 'catch {...}' nu? ... –

+0

Non ... exactement pareil – devios1

Répondre

1

Vérifiez dans les paramètres d'exception du débogueur pour voir si vous dites au débogueur de se casser lorsque NullReferenceException est levé.

+0

N'explique pas pourquoi mon application affiche ma boîte de dialogue d'exception lorsqu'elle est exécutée sans le débogueur. – devios1

+0

La chose étrange est, il me montre la ligne exacte dans le débogueur avec le bloc de capture en dessous avec un fond gris, mais le point d'arrêt dans le bloc catch n'est jamais touché. Je posterai une image ... – devios1

+0

@chaiguy: J'ai vu quelque chose comme ça quand le PC actuel était dans le code _called_ de la zone grise, mais qu'il n'y était pas. Le PC actuel n'était pas affichable (pas de code source). Je me demande ce que vous verriez si vous avez activé le mode Démontage? –

0

Je suis sûr que vous pouvez attraper des exceptions juste après une invocation et il n'y a pas de mécanisme spécifique à la réflexion nécessaire pour l'attraper.

La méthode que vous appelez peut-être utiliser le threading et lier l'exception dans un thread enfant? Cela pourrait empêcher votre try-catch de manquer l'exception si l'exception se produit dans un thread anychronous qui n'est pas terminé avant de quitter l'instruction try-catch.

+0

Hmm, non, aucun fil d'enfant ne se passe ici. – devios1