给定 F#task
计算表达式,我可以编写:-
task {
try
let! accessToken = getAccessTokenAsync a b
try
let! resource = getResourceAsync accessToken uri
// do stuff
with
| ex -> printfn "Failed to get API resource. %s" ex.Message
with
| ex -> printfn "Failed to get access token. %s" ex.Message
return ()
}
但我想做的是围绕两个函数调用进行非嵌套异常处理。getBlahAsync
这可以在 C# 中通过async
具有多个await
s 的方法很容易地完成。
如何在 F# 计算表达式中这样做?如果我以简单明了的方式尝试,accessToken
从第一个try..with
不会流入第二个try..with
。
(嵌套的问题是该// do stuff
部分可能会增长一点,将外部推得with
越来越远try
。)
如何在 C# 中做到这一点:-
static async Task MainAsync()
{
String accessToken = null;
try
{
accessToken = await GetAccessTokenAsync("e", "p");
}
catch (Exception ex)
{
Console.Error.WriteLine("Failed to get access token. " + ex.Message);
return;
}
String resource = null;
try
{
resource = await GetResourceAsync(accessToken);
}
catch (Exception ex)
{
Console.Error.WriteLine("Failed to get API resource. " + ex.Message);
return;
}
// do stuff
}