title: C# - Try/Catch with predicate expression
body: <p>The following is an example taken from <a href="https://msdn.microsoft.com/en-us/library/0yd65esw.aspx" rel="noreferrer">MSDN, try-catch (C# Reference)</a></p>
  <pre><code>catch (ArgumentException e) if (e.ParamName == &quot;…&quot;)
  {
  }
  </code></pre>
  <p>They also say</p>
  <blockquote>
  <p>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.</p>
  <p>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.</p>
  </blockquote>
  <p>My code:</p>
  <pre><code>static bool LogFunction(System.Exception ex)
  {
      System.Console.WriteLine(&quot;Writing to logfile: {0}&quot;, ex.Message);
      return false;
  }
  
  static void Main(string[] args)
  {
      try
      {
          throw new System.ArgumentException(&quot;The exception message...&quot;);
      }
      catch(System.Exception ex) if (LogFunction(ex))
      {
          System.Console.WriteLine(&quot;This will not be executed, ever!&quot;);
      }
      catch(System.ArgumentException ex)
      {
          // ....
      }
  }
  </code></pre>
  <p>Now, the compiler won't compile this (csc.exe), giving the following error message:</p>
  <pre><code>error CS1003: Syntax error, 'when' expected
  </code></pre>
  <p>Edit: The compiler raises the error for the line</p>
  <pre><code>error CS1003: Syntax error, 'when' expected
  </code></pre>
  <p>What am I doing wrong?</p>
  <p>Thanks.</p>
  <p><strong>EDIT: I submitted feedback to MSDN pointing out the error in the documentation.</strong></p>