読者です 読者をやめる 読者になる 読者になる

デバッグ中にAsync.FromBeginEnd内部でExceptionが発生すると、デバッガが止まってしまって邪魔くさい

F#

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

めでたしめでたし。