Auparavant, Visual Studio avait une case à cocher spécifique pour "Annuler une exception non gérée". En 2015, cela a été supprimé (ou déplacé quelque part, je ne le trouve pas). Alors maintenant, mes projets convertis ne sont plus interrompus si je ne parviens pas à fournir un gestionnaire d'exceptions au niveau de l'utilisateur. Je ne veux pas interrompre toutes les "exceptions lancées" parce que je gère des exceptions spécifiques. Juste là où je ne parviens pas à fournir un gestionnaire spécifique.
À l'heure actuelle, mon code quitte simplement la procédure en cours et continue l'exécution à l'emplacement suivant de la pile d'appels, PAS BON.
Quelqu'un sait comment récupérer cela dans Visual Studio 2015? Je viens de passer à l'édition communautaire hier.
Tool
ouWindow
aura tous les emplacements souhaités. Dans votre cas, vous recherchez des paramètres d'exception .Réponses:
Une nouvelle fenêtre appelée "Paramètres d'exception" apparaît par défaut dans le volet inférieur droit lorsque vous commencez le débogage. Il a toutes les options que vous attendez.
Vous pouvez en parler avec CTRL+ ALT+E
Cela vous permet de sélectionner les exceptions qui provoquent une interruption du débogueur.
La clé, cependant, est que vous pouvez également définir si ces exceptions sont toujours interrompues ou ne sont interrompues que lorsqu'il s'agit d'une exception non gérée - mais la configuration n'est pas très intuitive.
Vous devrez d'abord cocher "Activer juste mon code" sous Outils> Options> Débogage.
Cela vous permet ensuite de cliquer avec le bouton droit de la souris sur l'en-tête de colonne (Break When Thrown) dans la nouvelle fenêtre Exceptions Settings, et d'ajouter la colonne "Additional Actions", qui vous permet ensuite de définir chaque exception comme "Continue when unhandled in user code".
Il vous suffit donc de cliquer avec le bouton droit de la souris sur une exception ou sur un groupe entier et de désactiver l'indicateur "Continuer si non géré dans le code utilisateur". Malheureusement, la colonne "Actions supplémentaires" apparaîtra vide, ce qui équivaut à "Pause si non gérée dans le code utilisateur".
Plus à ce sujet ici:
http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx
la source
J'ai eu le même problème et j'ai réussi à le résoudre en faisant ceci -
C'est tout!
J'ai été inspiré par cet article car j'utilise une version x64 de Windows .
la source
System.ArgumentException
est géré et des moments où ce n'est pas le cas. Je me soucie seulement de casser quand ce n'est pas manipulé.Pour les googleurs qui souhaitent se casser uniquement lorsque l'exception concerne leur code, il existe une option dans Visual Studio 2015: Options-> Débogage-> Général-> Juste mon code. Une fois coché, il permet de ne pas casser lorsque l'exception est gérée (levée et interceptée) en dehors de votre code.
la source
Microsoft a subtilement modifié la logique dans la nouvelle fenêtre d'exceptions.
Voir http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx
L'élément clé étant:
Cependant , si comme moi vous avez un Global Unhandled Exception Handler dans votre code, le deuxième élément de cette liste est essentiel: pour moi, aucune exception ne sera donc vraiment non gérée, ce qui semble être différent de VS2013.
Pour rétablir le comportement où VS se casse sur les exceptions non gérées, j'ai dû cocher tous les types d'exceptions sur lesquels je voulais interrompre puis m'assurer que les "Options supplémentaires" (vous devrez peut-être rendre cette colonne visible *) pour "Continuer lorsqu'il n'est pas géré dans le code utilisateur "n'était PAS défini. La logique VS2015 ne semble pas considérer mon gestionnaire d'exceptions global non géré comme étant "géré dans le code utilisateur", donc il se casse sur ceux-ci; il ne casse pas sur les exceptions capturées cependant. Cela le fait fonctionner comme VS2013 l'a fait.
* Comment activer la colonne "Actions supplémentaires"
la source
Si je lis correctement entre les lignes ici, le problème est que votre exception «disparaît» effectivement, même si le comportement du débogueur par défaut doit être interrompu sur les exceptions non gérées.
Si vous disposez de méthodes asynchrones, vous rencontrez peut-être ce problème car les exceptions non interceptées sur un thread de pool de threads dans le cadre d'une continuation de tâche ne sont pas considérées comme des exceptions non gérées. Au contraire, ils sont avalés et stockés avec la tâche.
Par exemple, jetez un œil à ce code:
Si vous exécutez ce programme avec les paramètres du débogueur par défaut (arrêt uniquement sur les exceptions non gérées), le débogueur ne s'arrêtera pas. Cela est dû au fait que le thread du pool de threads alloué à la suite avale l'exception (en la transmettant à l'instance Task) et se libère dans le pool.
Notez que, dans ce cas, le vrai problème est que le
Task
renvoyé parTest()
n'est jamais vérifié. Si vous avez des types similaires de logique «feu et oubliez» dans votre code, vous ne verrez pas les exceptions au moment où elles sont lancées (même si elles ne sont pas gérées dans la méthode); l'exception n'apparaît que lorsque vous observez la tâche en l'attendant, en vérifiant son résultat ou en regardant explicitement son exception.Ce n'est qu'une supposition, mais je pense que vous observez probablement quelque chose comme ça.
la source
Debugger.Break()
appel explicite . Alternativement, vous pouvez ajouter un expliciteDebugger.Break()
dans leTaskScheduler.UnobservedTaskException
gestionnaire, bien que l'inconvénient ici soit que cela peut se déclencher beaucoup plus tard que l'exception d'origine, comme cela se produit sur le thread du finaliseur lorsque la tâche est nettoyée. En général, vous devez vous efforcer de toujours observer les résultats de la tâche ou au moins avoir un bloc try-catch à enregistrer au moment de l'échec.D'après mon expérience, les paramètres d'exception en 2015 sont complètement déstabilisés si vous changez quoi que ce soit.
On s'attend à ce que si vous atteignez le groupe parent "CLR", vous ne devriez pas obtenir d'execpt de rupture pour non géré. Vous serez toujours interrompu si une exception n'est pas gérée. Mais, si vous avez décoché le groupe CLR, le code à l'intérieur d'un try ... catch ne devrait tout simplement pas provoquer de coupure. Ce n'est pas le cas.
Solution: dans la nouvelle boîte à outils des paramètres d'exception, cliquez avec le bouton droit de la souris et choisissez «restaurer les paramètres par défaut». Taadaaaa ... Il se comporte à nouveau normalement. Maintenant, ne foutez pas ça.
la source
Essayez de suivre les instructions:
https://msdn.microsoft.com/en-us/library/x85tt0dd.aspx
la source
try { task.Wait(); } catch { ... }
) et OperationCanceledException dans la tâche était considérée comme non gérée dans le code utilisateur d'une manière ou d'une autre.Tout cela est un peu déroutant, et à mon avis pas aussi bon que l'ancien dialogue des exceptions, mais de toute façon.
Si une exception est dans la liste et cochée, le débogueur s'arrêtera chaque fois que l'exception est levée.
Si une exception est décochée ou non dans la liste, le débogueur ne sera interrompu que lorsque ce type d'exception n'est pas géré par l'utilisateur.
Par exemple, dans la capture d'écran ci-dessous, le débogueur s'arrêtera chaque fois que a
System.AccessViolationException
est lancé, mais pour toutes les autres exceptions, il ne sera interrompu que si l'exception n'a pas été gérée par l'utilisateur.la source
Lors de la mise à niveau vers VS2015, j'ai également eu des problèmes où les exceptions "cassaient" l'application, mais sont maintenant ignorées et passées directement. Il y a des moments où nous voulons que notre code lève intentionnellement des exceptions là où nous voulons que le code s'arrête, plutôt que de continuer. Nous utilisons toujours la phrase
Throw New Exception("Message")
pour que notre code se brise intentionnellement:Avec VS2015, c'est le classique "System.Exception" qui est lancé quand on dit
Throw New Exception
. Par conséquent, nous devions cocher la case "System.Exception" dans les nouveaux paramètres d'exception:Vérifiez la boîte System.Exception
Une fois vérifié, notre code a fonctionné comme prévu.
la source
La solution est que cela est sémantiquement le contraire de ce que vous pensez définir. Vous devez vous assurer que Continuer lorsque non géré dans le code utilisateur n'est pas activé, c'est- à- dire qu'il n'est pas coché comme indiqué dans la colonne Actions supplémentaires de l' onglet Paramètres d'exception - voir ci-dessous:
vous dites effectivement ne pas continuer (c'est-à-dire interrompre) lorsqu'il n'est pas géré dans le code
Pour faire ça:
Cela l'a fait pour moi - heureux à nouveau.
C'était dans VS 2015
la source
Il y a certainement un bogue dans Visual Studio qui peut le bloquer et nécessiter un redémarrage. Même VS2015.
J'ai eu une situation à un seul thread où a
NullReferenceException
était intercepté par un gestionnaire «externe» (toujours dans mon code) même si je lui ai demandé de se casser quand il a été déclenché.Je me rends compte que c'est une exception «gérée» et que vous parlez d'une exception «non gérée» - mais je suis presque sûr que parfois un redémarrage rapide de VS résoudra ce problème, si IISRESET ne le fait pas.
la source
Visual Studio 2017 fonctionne très bien avec la gestion des erreurs. Visual Studio 2015, d'autre part, aspire à la gestion des erreurs avec les tâches car en mode débogage, toutes les exceptions qui se produisent dans une tâche asynchrone sont interceptées, mais si je marche dessus, cela se bloque indéfiniment. S'il est exécuté sans débogage, il se bloque indéfiniment sans aucune exception interceptée !!! J'adore Visual Studio et je l'utilise depuis 1995 et 2015 est de loin la pire version bien que j'aie sauté de 2010 directement à 2015. J'ai passé 8 heures à essayer de faire fonctionner cette gestion des exceptions sans succès. J'ai copié le code exact de 2017 sur mon ordinateur personnel et cela a parfaitement fonctionné. Je suis très irrité que Microsoft ait poussé des tâches dans un cadre que le compilateur 2015 ne peut pas gérer correctement.
la source