我有以下代码:
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("")
}
答案 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