jensa
jensa

Reputation: 2890

C# - Try/Catch with predicate expression

The following is an example taken from MSDN, try-catch (C# Reference)

catch (ArgumentException e) if (e.ParamName == "…")
{
}

They also say

Using catch arguments is one way to filter for the exceptions you want to handle. You can also use a predicate expression that further examines the exception to decide whether to handle it. If the predicate expression returns false, then the search for a handler continues.

Exception filters are preferable to catching and rethrowing (explained below) because filters leave the stack unharmed. If a later handler dumps the stack, you can see where the exception originally came from, rather than just the last place it was rethrown. A common use of exception filter expressions is logging. You can create a predicate function that always returns false that also outputs to a log, you can log exceptions as they go by without having to handle them and rethrow.

My code:

static bool LogFunction(System.Exception ex)
{
    System.Console.WriteLine("Writing to logfile: {0}", ex.Message);
    return false;
}

static void Main(string[] args)
{
    try
    {
        throw new System.ArgumentException("The exception message...");
    }
    catch(System.Exception ex) if (LogFunction(ex))
    {
        System.Console.WriteLine("This will not be executed, ever!");
    }
    catch(System.ArgumentException ex)
    {
        // ....
    }
}

Now, the compiler won't compile this (csc.exe), giving the following error message:

error CS1003: Syntax error, 'when' expected

Edit: The compiler raises the error for the line

error CS1003: Syntax error, 'when' expected

What am I doing wrong?

Thanks.

EDIT: I submitted feedback to MSDN pointing out the error in the documentation.

Upvotes: 22

Views: 2868

Answers (1)

Jakub Lortz
Jakub Lortz

Reputation: 14894

That's an error on the MSDN site. As the compiler suggests, you should use when instead of if.

Upvotes: 22

Related Questions