在异步中抛出异常

我有以下代码:

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

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

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("")
}
最佳答案
你当然需要在括号中包含新的Exception(…),但在这种情况下这还不够 – match语句的两个分支都需要返回一个值,所以你还需要插入return:

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

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

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

转载注明原文:在异步中抛出异常 - 代码日志