我最近遇到过这个问题,想检查一下我是否对F#例外有误解。我正在使用Visual Studio 2012.给出以下F#代码:
[<EntryPoint>]
let main argv =
try
raise (System.AccessViolationException("foo"))
printfn "Should not get here"
raise (System.AccessViolationException("foo"))
printfn "Should not get here either"
with | :? System.FormatException -> printfn "Should not get here"
这会引发和{VoutlationException不应被with
语句捕获,因为with
只处理System.FormatException。我希望调试器在发生异常时位于第一个raise
,但它实际上位于with
的末尾:
现在问题是我无法看到引发异常的地方,也看不到有关异常的任何信息,例如stacktrace。我不认为我想更改个别异常的异常设置,因为我想知道任何未处理的异常(类似于C#
或VB.NET
)的位置,而不是在抛出时。
如果这只是它的方式,那就没关系,但我只是想问,因为我对F#
不是很熟悉,我想确保我没有错过任何东西。我在网上看了一下,但没有发现任何相关信息。
答案 0 :(得分:2)
除非您想要在抛出异常类型时修改异常设置(或异常设置中的异常类别),否则您需要确保代码处理未处理的异常,但最适合您的代码。
try
raise (System.AccessViolationException("foo"))
with
| :? System.FormatException -> printfn "Should not get here"
| _ as ex ->
#if DEBUG
System.Diagnostics.Debugger.Break();
#else
printfn "Unhandled exception ('%s'): '%s'" (ex.GetType().Name) ex.Message
#endif