gpt4 book ai didi

exception-handling - 如何在 F# 任务计算表达式中的每个步骤上实现非嵌套异常处理?

转载 作者:行者123 更新时间:2023-12-04 16:06:38 26 4
gpt4 key购买 nike

鉴于 F# task computation expression我可以写:-

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
}

最佳答案

翻译 C# 代码的主要问题是 F# 不允许您使用 return提前跳出函数体。您可以通过各种方式避免嵌套异常,但您将无法提前返回。这可以实现为 another computatione expression ,但这更像是一种好奇心,而不是您真正想在这里使用的东西。

我的建议是将函数拆分为一个获取所有资源并处理异常的函数,另一个执行这些操作。这不会消除嵌套,但会使代码具有相当的可读性。

let doStuff accessToken resource = task {
// do stuff
}

let getResourcesAndDoStuff a b uri = task {
try
let! accessToken = getAccessTokenAsync a b
try
let! resource = getResourceAsync accessToken uri
return! doStuff accessToken resource
with ex ->
printfn "Failed to get API resource. %s" ex.Message
with ex ->
printfn "Failed to get access token. %s" ex.Message
}

顺便说一句,您是否有使用 task 的特殊原因?而不是普通的内置 F# async工作流程?不一定是问题,但 async组合更好并支持取消,因此它通常是一个明智的默认选择。

关于exception-handling - 如何在 F# 任务计算表达式中的每个步骤上实现非嵌套异常处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47943197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com