我尝试运行任务以通过F#在Azure中保存文档,并且我希望能够让任务抛出的任何异常不会立即抛出调用线程,而是使用Task对象查看是否有错误并妥善处理。
let update (c : CoolObjectName) =
let uri = documentUri c.id
let t = client.ReplaceDocumentAsync(uri, c)
|> Async.AwaitTask
|> Async.StartAsTask
如果出现此错误,则会立即抛出该错误。
我不确定Async.StartAsTask
是否在等待任何事情。我不完全确定这里有什么点,如果有的话,我实际上在等待任务完成。 t
此处的类型为Task<SomeAzureThing>
。我后来检查它是否有故障,但这并不能保证它不会失败。
我不需要响应对象,如果Task
失败,我只需要错误消息。
我可以做Async.RunSynchronously
,但这会导致在调用线程上抛出任何异常。我已尝试使用t.Wait()
,但Wait()
会抛出遇到的任何异常。
修改
关于转换到/来自任务&amp;异步。这不是一个有意的设计决定,但我试图找到一个方法,我有办法(1)检索函数调用的结果或(2)知道函数调用错误而不实际抛出该错误。我知道如何做到这一点的最好方法是通过任务。如果我不做这种不必要的转换,我最终会得到Async<Choice<int,exn>>
:
let t = client.ReplaceDocumentAsync(uri, c)
|> Async.AwaitTask
|> Async.Catch
我似乎没有办法去&#34;得到&#34;没有Async.RunSynchronously
的捕获的结果,它会引发异常。
答案 0 :(得分:0)
或许Async.Catch
(link)是您想要的功能吗?
创建执行指定的异步计算 计算。如果此计算成功完成,那么这个 方法返回Choice1Of2返回的值。如果这个计算 在完成之前引发异常,然后返回Choice2Of2 引发的例外。