2008-11-18 11 views
4

Est-il possible d'ordonner à C# d'ignorer NullReferenceException (ou toute exception spécifique d'ailleurs) pour un ensemble d'instructions. Ceci est utile lorsque vous essayez de lire les propriétés d'un objet désérialisé qui peut contenir plusieurs objets NULL. Avoir une méthode d'assistance pour vérifier null peut être un moyen mais je cherche quelque chose près de 'Sur Erreur Resume Next' (à partir de VB) à un bloc de niveau d'instruction.Ignorer NullReferenceException lors de la lecture des propriétés d'un objet

EDIT: Try-catch sautera les déclarations suivantes sur exception

try 
{ 
    stmt 1;// NullReferenceException here, will jump to catch - skipping stmt2 and stmt 3 
    stmt 2; 
    stmt 3; 
} 
catch (NullReferenceException) { } 

Par exemple: Je désérialisation un message XML à un objet et puis essayez d'accéder à une propriété comme

Message.instance[0].prop1.prop2.ID 

maintenant prop2 pourrait être un objet nul (car il n'existe pas dans XML Message - un élément optionnel dans XSD). Maintenant, je dois vérifier null pour chaque élément de la hiérarchie avant d'accéder à l'élément feuille. Je dois vérifier si instance [0], prop1, prop2 ne sont pas NULL, avant d'accéder à 'ID'.

Y a-t-il un meilleur moyen d'éviter la vérification par zéro pour chaque élément de la hiérarchie?

Répondre

1

maintenant je suis délégué à l'aide et la manipulation NullReferenceException

public delegate string SD();//declare before class definition 

string X = GetValue(() => Message.instance[0].prop1.prop2.ID); //usage 

//GetValue defintion 
private string GetValue(SD d){ 
     try 
     { 
      return d(); 
     } 
     catch (NullReferenceException) { 
      return ""; 
     } 

    } 

Merci à Try-catch every line of code without individual try-catch blocks pour l'idée

6

En résumé: non. Null-vérifier la référence avant d'essayer de l'utiliser. Une astuce utile ici peut-être C# 3.0 méthodes d'extension ... ils vous permettent de semblent à invoquer quelque chose sur une référence null sans erreur:

string foo = null; 
foo.Spooky(); 
... 
public static void Spooky(this string bar) { 
    Console.WriteLine("boo!"); 
} 

Autre que cela - peut-être une certaine utilisation de l'opérateur conditionnel?

string name = obj == null ? "" : obj.Name; 
0
try 
{ 
    // exceptions thrown here... 
} 
catch (NullReferenceException) { } 
+0

Sauf que vous auriez besoin que pour chaque ligne qui pourrait jeter ... –

4

L'opérateur ternaire et/ou ?? l'opérateur peut être utile.

Dites que vous essayez d'obtenir la valeur de myItem.MyProperty.GetValue(), et MyProperty pourrait être nulle, et que vous voulez par défaut une chaîne vide:

string str = myItem.MyProperty == null ? "" : myItem.MyProperty.GetValue(); 

Ou dans le cas où le retour valeur de GetValue est nulle, mais vous voulez quelque chose par défaut:

string str = myItem.MyProperty.GetValue() ?? "<Unknown>"; 

Cela peut être combiné à:

string str = myItem.MyProperty == null 
    ? "" 
    : (myItem.MyProperty.GetValue() ?? "<Unknown>"); 
0

J'irais avec la méthode d'aide. Sur Erreur Resume Next mène juste à la folie.