デバッグ中にAsync.FromBeginEnd内部でExceptionが発生すると、デバッガが止まってしまって邪魔くさい
F#でちょっと非同期Socketのコードを書いてるんですが、
type Socket with member this.AsyncReceive(bytes, flags) = Async.FromBeginEnd(bytes, flags, (fun (_, _, callback, state) -> this.BeginReceive(bytes, 0, bytes.Length, flags, callback, state)), this.EndReceive)
みたいな書き方だと、クライアント側で強制的にSocketを切った場合に、EndReceive()がSocketExceptionをスローして、毎回そこでデバッガが停止してしまう。特に問題のない箇所なのにデバッガが止められてしまうと非常に邪魔くさい。
そこで、EndReceive()をtryで囲んで、Choiceで正常値/Exceptionを返すようにしてみたら解決した。
type Socket with member this.AsyncReceive(bytes, flags) = Async.FromBeginEnd(bytes, flags, (fun (_, _, callback, state) -> this.BeginReceive(bytes, 0, bytes.Length, flags, callback, state)), (fun result -> try Choice1Of2(this.EndReceive(result)) with | :? SocketException as exn when exn.ErrorCode = 10054 -> Choice1Of2 0 | exn -> Choice2Of2 exn ))
めでたしめでたし。