2017-02-17 1 views
1

Le code suivant génère un NullReferenceException, mais n'est pas pris par le bloc d'essai (aussi bien en mode Debug et Release):Pourquoi l'exception n'est-elle pas détectée?

using System; 

namespace ExceptionTest { 
    public class Program { 
     public static void Main(string[] args) { 
      String text = null; 
      try { 
       if (text.Equals("t1")) { 
        Console.WriteLine("r1"); 
       } else { 
        Console.WriteLine("r2"); 
       } 
      } catch(Exception ex) { 
       Console.WriteLine("Exception catched!"); 
      } 
     } 
    } 
} 

Au lieu les pauses du programme et la ligne incriminée est mis en évidence:

enter image description here

Pourquoi?

Mise à jour: représentation textuelle de l'exception comme suggéré par Scott:

System.NullReferenceException occurred 
    HResult=-2147467261 
    Message=Object reference not set to an instance of an object. 
    Source=ExceptionTest 
+9

Vous * probablement * avez votre débogueur configuré pour briser les exceptions de première chance. Si vous exécutez ceci sans un débogueur joint, est-ce qu'il imprime "Exception attrapé"? – vcsjones

+0

aussi avez-vous essayé d'utiliser '==' si je ne me trompe pas, il émet des exceptions différemment que 'string.equals (string)' – Andrew

+3

Il est généralement mauvais d'attraper des exceptions générales comme ça. Cela peut conduire à un comportement sparatique et introuvable dans votre code. Sans parler des exceptions sont extrêmement non-performant. Si une variable peut être nulle, vous devriez vérifier une valeur nulle avant d'y accéder! –

Répondre

3

Sur l'image par exemple dans les paramètres d'exception: tour de la case à cocher. En faisant cela, il ne se cassera pas lorsqu'une exception de référence nulle est levée. Et la capture capturera l'exception.

+1

J'ai choisi cette réponse comme étant la bonne, car c'était la première à avoir trouvé la solution. Je vous remercie! – salocinx

2

Si vous utilisez Visual Studio 2015:

Debug-> Windows-> Paramètres d'exception

Rechercher NullReferenceException et décocher que.

3

Il arrive parce que vous avez cette case cochée

enter image description here

Cela fait votre pause débogueur avant qu'il arrive au bloc catch, si vous frappez continuer à vous voir continuer dans la prise. Si vous décochez la case, vous pouvez la réactiver dans la fenêtre "Paramètres d'exception" du menu déroulant Debug -> Windows -> Exception Settings. La section "Common Language Runtime Exceptions" contient l'option NullRefrenceException.

enter image description here

+0

Merci pour la réponse détaillée! – salocinx