2009-02-25 8 views
4

J'ai récemment fait la déclaration à un collègue que:NullRefs doit-il être détecté?

NullReferenceExceptions devraient jamais être pris explicitement

je ne le mot .... hmmm. Je n'ai jamais vu un cas d'utilisation approprié pour les attraper mais je voulais vérifier si quelqu'un d'autre a?

Jamais est un mot fort après tout .....

Répondre

6

Cela dépend de pourquoi; voir blog entry d'Eric Lippert. Si elles sont des "exceptions boneheaded", alors non - il suffit de fixer le code appelant. Dans les rares cas où ce sont des «exceptions frustrantes» (c'est-à-dire que le code que vous appelez a des pièges qu'il est difficile d'éviter), alors je suppose que vous devriez le faire.

+0

super article, merci. – Quibblesome

+0

Merci pour le grand article lien –

4

Eh bien, quand vous appelez dans une poussette bibliothèque tierce partie qui fait ocasionnaly nullrefs, il est probablement une bonne idée de les attraper si vous savez comment traiter correctement avec eux.

Exemple de vie réelle: Dans le passé, j'ai utilisé assez largement une grille de données fournie par un éditeur tiers. Ils ont (ou avaient à ce moment-là) un bogue confirmé qui devrait jeter un nullref (imbriqué dans leur pile d'appels) de temps en temps lors de la mise à jour de certaines données dans la source de données sous-jacente.

J'ai eu affaire à la situation avec ce code:

  try 
      { 
       // do the update 
      } 
      catch (NullReferenceException) 
      { 
       try 
       { 
        // redo the update 
       } 
       catch (NullReferenceException ex) 
       { 
        // properly log the third party lib failure 
       } 
      } 

BTW, mon code « log » n'a jamais exécuté en 2 ans :) maintenant l'éditeur tiers a résolu le problème, et je devrait probablement supprimer ce code.

0

Je ne dirais jamais. Par exemple, vous pourriez l'attraper pour consigner l'exception ou la faire passer d'un fil à l'autre. Dans les deux cas, l'exception devrait être relancée. Comme le souligne Marc Gravell, Eric Lippert a une très bonne entrée sur son blog à propos des exceptions.

+0

Aye mais dans ce cas, vous allez attraper Exception plutôt que d'attraper explicitement NullReferenceException – Quibblesome

+0

Je lisais juste votre poste quand j'ai remarqué "explicitement". Étant donné que j'aurais tendance à aller avec «jamais» ou du moins «jamais, à moins d'avoir une très bonne raison et de savoir exactement ce que vous faites». –

4

Peut-être la citation correcte est

NullReferenceExceptions ne doivent jamais être explicitement pris si vous possédez le code qui jette l'exception

+0

oOui maintenant c'est un bien meilleur résumé que le mien. – Quibblesome

0

J'ai eu une fois pour construire une grande chaîne basée sur les valeurs de 15 variables ou plus. Au lieu de vérifier la nullité de chacun, j'ai simplement créé la chaîne, déréférencé les variables et attrapé le NRE. Pour être honnête, je me sentais mal et méchant, mais cela m'a évité d'écrire beaucoup de code.

+0

vous ne devriez JAMAIS faire cela: p – Brann

1

Vous avez raison, "jamais" est un mot fort.

La capture d'une exception NullReferenceException (ou d'un NPE pour Java) dépendra toujours de l'objectif du code.Par exemple, si votre application EXIGE que le traitement se poursuive même avec un état potentiellement incertain (pensez à des systèmes de support de vie) ou si votre code ne se soucie pas de l'état de l'objet référencé (ex: littéralement, mauvaises données).

C'est une bonne règle de ne pas attraper ces types d'exceptions, mais pas une loi.

+0

Aye mais dans ces cas vous attraper le type d'exception de base pas une exception NullReferenceException explicitement (excuses pour mon pedantry). – Quibblesome

+0

Ok, mais attrapé aucun-le-moins ... :) – Bill

Questions connexes