6

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?

5 Answers 5

6

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;
Sign up to request clarification or add additional context in comments.

Comments

5

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

Comments

1

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

Comments

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

Comments

0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.