title: Async.Catch doesnt work on OperationCanceledExceptions
body: <p>I use Async.Catch to handle exceptions thrown by async workflows:</p>
  
  <pre><code>work
  |&gt; Async.Catch
  |&gt; Async.RunSynchronously
  |&gt; fun x -&gt; match x with
              | Choice1Of2 _ -&gt; () // success
              | Choice2Of2 ex -&gt; // failure, handle exception
  </code></pre>
  
  <p>Today I noticed that OperationCanceledExceptions aren't handled by Async.Catch. Instead of getting a Choice from Async.Catch the exception keeps bubbling up until it hits me. I expected the following test to be red, but it's green:</p>
  
  <pre><code>  [&lt;Test&gt;]
    let ``Async.Catch doesnt work on OperationCancelledExceptions``() =
      use cancellationTokenSource = new System.Threading.CancellationTokenSource(1000)
  
      let work = async {
        while true do
          do! Async.Sleep 100
      }
  
      (fun () -&gt; work
                 |&gt; Async.Catch
                 |&gt; fun x -&gt; Async.RunSynchronously (x, cancellationToken=cancellationTokenSource.Token)
                 |&gt; ignore)
      |&gt; should throw typeof&lt;System.OperationCanceledException&gt;
  </code></pre>
  
  <p>Evaluating some exceptions with Async.Catch + Choices + matching and some others using try/catch blocks doesn't seem right... it would look like the following, which is way too complicated. Besides that I wonder what use Async.Catch has, since I have to use a try/catch block anyway...:</p>
  
  <pre><code>  [&lt;Test&gt;]
    let ``evaluating exceptions of async workflows``() =
      use cancellationTokenSource = new System.Threading.CancellationTokenSource(1000)
  
      let work = async {
        while true do
          do! Async.Sleep 100
      }
  
      try
        work
        |&gt; Async.Catch
        |&gt; fun x -&gt; Async.RunSynchronously (x, cancellationToken=cancellationTokenSource.Token)
        |&gt; fun x -&gt; match x with
                    | Choice1Of2 result -&gt; () // success, process result
                    | Choice2Of2 ex -&gt; () // failure, handle exception
      with ex -&gt; () // another failure, handle exception here too
  </code></pre>
  
  <p>What's the best way to handle exceptions of async workflows? Should I just dump Async.Catch and use try/catch blocks everywhere?</p>