Ignore NullReferenceException when reading object properties

久未见 提交于 2019-12-01 03:44:15

问题


Is there any way to direct C# to ignore NullReferenceException (or any specific exception for that matter) for a set of statements. This is useful when trying to read properties from a deserialized object that may contain many null objects in it. Having a helper method to check for null could be one way but I'm looking for something close to 'On Error Resume Next' (from VB) at a block of statement level.

EDIT:Try-Catch will skip the succeeding statements on exception

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

For Example: I'm deserializing an XML message to an object and then try to access a property like

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

now prop2 could be a null object (because it doesn't exists in XML Message - an optional element in XSD). right now I need to check for null for each element in the hierarchy before accessing the leaf element. i.e I've to check if instance[0], prop1, prop2 are not null, before accessing 'ID'.

Is there a better way that avoids null-checking for each element in the hierarchy?


回答1:


In short: no. Null-check the reference before trying to use it. One useful trick here might be C# 3.0 extension methods... they allow you to appear to invoke something on a null reference without error:

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

Other than that - perhaps some use of the conditional operator?

string name = obj == null ? "" : obj.Name;



回答2:


The ternary operator and/or ?? operator may be useful.

Say you are trying to get the value of myItem.MyProperty.GetValue(), and MyProperty could be null, and you want to default an empty string:

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

Or in the case where the return value of GetValue is null, but you want to default to something:

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

This can be combined to:

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



回答3:


now I'm using delegate and NullReferenceException handling

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 "";
        }

    }

Thanks to Try-catch every line of code without individual try-catch blocks for the idea




回答4:


try
{
   // exceptions thrown here...
}
catch (NullReferenceException) { }



回答5:


I would go with the helper method. On Error Resume Next just leads to madness.



来源:https://stackoverflow.com/questions/298009/ignore-nullreferenceexception-when-reading-object-properties

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!