具有F#异常处理的调试器中断位置

时间:2014-02-17 21:50:31

标签: f#

我最近遇到过这个问题,想检查一下我是否对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的末尾:

debugger

现在问题是我无法看到引发异常的地方,也看不到有关异常的任何信息,例如stacktrace。我不认为我想更改个别异常的异常设置,因为我想知道任何未处理的异常(类似于C#VB.NET)的位置,而不是在抛出时。

如果这只是它的方式,那就没关系,但我只是想问,因为我对F#不是很熟悉,我想确保我没有错过任何东西。我在网上看了一下,但没有发现任何相关信息。

1 个答案:

答案 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