F# асинхронный веб-запрос, обрабатывая исключения

Не уверенный, если это точно, что Вы имели в виду, но:

$# = Количество аргументов передало сценарию

удара Иначе, Вы могли бы искать что-то как man wc

6
задан CCovey 9 April 2015 в 19:51
поделиться

2 ответа

Теперь он называется «AsyncGetResponse» (больше не «GetResponseAsync»). «Выполнить» было переименовано в «Запускать синхронно». Так что я не думаю, что вы упускаете здесь что-то существенное, просто измените название в последней версии.

Каковы ваши настройки отладчика в отношении «Tools \ Options \ Debugging \ General \ Enable Just My Code» и «Debug» \ Исключения "(например, установить прерывание, когда генерируется первое исключение CLR или нет)? Мне неясно, касается ли ваш вопрос поведения программы или поведения инструментов VS (похоже на последнее). Это еще больше осложняется тем фактом, что точки останова / отладки в «местах» в F # Beta1 имеют некоторые ошибки, особенно в отношении асинхронных рабочих процессов, это означает, что поведение, которое вы видите в отладчике, может выглядеть немного странно, даже если программа выполняется правильно ...

Используете ли вы VS2008 CTP или VS2010 Beta1?

В любом случае, это исключение из-за ожидается ответ 500, так работает WebRequest. Вот небольшая демонстрационная программа:

open System
open System.ServiceModel 
open System.ServiceModel.Web 

[<ServiceContract>]
type IMyContract =
    [<OperationContract>]
    [<WebGet(UriTemplate="/Returns500")>]
    abstract Returns500 : unit -> unit
    [<OperationContract>]
    [<WebGet(UriTemplate="/Returns201")>]
    abstract Returns201 : unit -> unit

type MyService() =
    interface IMyContract with
        member this.Returns500() =
            WebOperationContext.Current.OutgoingResponse.StatusCode <- 
                System.Net.HttpStatusCode.InternalServerError 
        member this.Returns201() =
            WebOperationContext.Current.OutgoingResponse.StatusCode <- 
                System.Net.HttpStatusCode.Created 

let addr = "http://localhost/MyService"
let host = new WebServiceHost(typeof<MyService>, new Uri(addr))
host.AddServiceEndpoint(typeof<IMyContract>, new WebHttpBinding(), "") |> ignore
host.Open()

open System.Net

let url500 = "http://localhost/MyService/Returns500"
let url201 = "http://localhost/MyService/Returns201"
let async_value (url:string) = 
    async {  
        let req = WebRequest.Create(url)  
        let! rsp = req.AsyncGetResponse()  
        return (rsp :?> HttpWebResponse).StatusCode
    }
let status = Async.RunSynchronously(async_value url201)
printfn "%A" status
try
    let status = Async.RunSynchronously(async_value url500)
    printfn "%A" status
with e ->
    printfn "%s" (e.ToString())
3
ответ дан 17 December 2019 в 07:07
поделиться

Вы можете использовать try ... внутри асинхронного кода для перехвата исключений:

let async_value =
    async {
        let req = WebRequest.Create("http://unknown")
        try
            let! resp = req.AsyncGetResponse()
            return "success"
        with
        |   :? WebException as e -> return "failure"
    }
1
ответ дан 17 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: