【发布时间】:2018-04-06 05:31:30
【问题描述】:
编辑:事实证明这是一个 F# 错误,可以通过使用自定义选项类型而不是 Fsharp 的“选项”来解决。
在 F# 中,我尝试使用 Async.AwaitTask 调用 .net 任务。该任务引发异常,我似乎无法使用 try-catch 或 Async.Catch 捕获它。而且我知道没有其他方法可以捕获异常。解决办法是什么?问题的原因是什么?感谢您的任何解释。
这是一些测试代码,显示我未能捕获 DownloadStringTaskAsync 引发的异常:
open System
open System.Net
[<EntryPoint>]
let main argv =
let test =
async{
let! exc = Async.Catch( async{
try
let w = new Net.WebClient();
let! str = Async.AwaitTask (w.DownloadStringTaskAsync "") // throws ArgumentException
return Some str
with
| _ ->
return None // not caught
}
)
match exc with
| Choice1Of2 r -> return r
| Choice2Of2 ext -> return None // not caught
}
let res = Async.RunSynchronously(test)
let str = Console.ReadLine();
0 // return an integer exit code
我需要一些方法来捕捉“测试”异步函数中的异常,防止它“冒泡”。
我找到了this 相关问题,但我似乎无法根据我的需要调整答案(涉及任务,而不是任务)。
编辑:这是显示问题的屏幕截图:https://i.gyazo.com/883f546c00255b210e53cd095b876cb0.png
“ArgumentException 未被用户代码处理。”
(Visual Studio 2013、.NET 4.5.1、Fsharp 3.1、Fsharp.core.dll 4.3.1.0。)
可能是代码正确,但某些 Fsharp 或 Visual Studio 设置阻止了异常被捕获?
【问题讨论】:
-
很抱歉让你失望了,但是这段代码对我来说非常好(异常被try-with捕获)。使用 F# 3.1。
-
它不适合我。见截图:i.gyazo.com/4de542103442e020e20b46bd8d7541e4.pngVisual Studio 2013, .net framework 4.5.1, Fsharp 3.1, Fsharp.core.dll 4.3.1
-
@seguso,Visual Studio 调试器中断的事实并不意味着异常未处理。尝试在没有调试器的情况下运行应用程序,它会崩溃吗?你也可以去
Debug -> Windows -> Exception Settings看看ArgumentException那里有没有勾选? -
@takemyoxigen:Visual Studio 说“ArgumentException 未被用户代码处理”这一事实误导了我。请参阅另一个屏幕截图:i.gyazo.com/883f546c00255b210e53cd095b876cb0.png 但是,如果我按继续,令人难以置信的是,程序会正确终止。所以你是对的。但是,在 Visual Studio 2013 中我没有 Debug > Windows > 异常设置,所以我不明白发生了什么。
-
@seguso 对不起,我的错。在 VS 2013 中,它是 Debug > Exceptions
标签: exception asynchronous exception-handling f# task-parallel-library