在异步中抛出异常

时间:2014-01-02 22:26:52

标签: exception f#

我有以下代码:

member public this.GetData(uri: string) = async {
    let! res = Async.AwaitTask(httpClient.GetAsync uri)
    return res
}

当属性res.IsSuccessStatusCodefalse时,我想抛出异常,我该如何实现呢?以下代码将无法编译:

member public this.GetData(uri: string) = async {
    let! res = Async.AwaitTask(httpClient.GetAsync uri)
    match res.IsSuccessStatusCode with
    | true -> return res
    | false -> raise new Exception("")
}

2 个答案:

答案 0 :(得分:8)

您当然需要将new Exception(...)括在括号中,但在这种情况下这还不够 - match语句的两个分支都需要返回一个值,因此您还需要插入return:< / p>

async {
    let! res = Async.AwaitTask(httpClient.GetAsync uri)
    match res.IsSuccessStatusCode with
    | true -> return res
    | false -> return raise (new Exception(""))
}

这实际上更容易使用if计算来编写,该计算可以包含返回单位的主体(如果操作不成功则抛出异常) - 因此您不需要return情况下:

async {
    let! res = Async.AwaitTask(httpClient.GetAsync uri)
    if not res.IsSuccessStatusCode then
        raise (new Exception(""))
    return res 
}

答案 1 :(得分:3)

所以第一部分是你需要用括号括起new Exception()以确保F#正确解释代码。

raise (new Exception(""))

或者你可以使用任何一个管道操作符

raise <| new Exception("")
new Exception |> raise

或者您可以更改类型并使用failwith

failwith "some message"

其次,您需要从两个分支返回,因此raise前缀为return