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

具有F#异常处理的调试器中断位置,f#,F#,我最近遇到了这个问题,想看看我是否对F#exceptions有什么误解。我正在使用Visual Studio 2012。给定以下F#代码: [] 让主argv= 尝试 raise(System.AccessViolationException(“foo”)) printfn“不应该到这里” raise(System.AccessViolationException(“foo”)) printfn“也不应该到这里” 与|:?System.FormatException->printfn“不应到达此

我最近遇到了这个问题,想看看我是否对F#exceptions有什么误解。我正在使用Visual Studio 2012。给定以下F#代码:

[]
让主argv=
尝试
raise(System.AccessViolationException(“foo”))
printfn“不应该到这里”
raise(System.AccessViolationException(“foo”))
printfn“也不应该到这里”
与|:?System.FormatException->printfn“不应到达此处”
这将引发并访问ViolationException异常,该异常不应被
with
语句捕获,因为
with
只处理System.FormatException。当异常发生时,我希望调试器位于第一个
提升
,但实际上它位于
的末尾,使用

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


如果是这样的话,那没关系,但我只是想问一下,因为我不太熟悉
F
,我想确保我没有遗漏什么。我在网上查看了一下,没有找到任何相关信息。

除非您想修改异常设置以在引发该异常类型(或异常设置中的一类异常)时中断,否则您需要确保您的代码处理了未处理的异常,但最适合您的代码

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

谢谢你的来信。是的,我同意您通常希望处理泛型异常,但在某些情况下(例如,在调试时),允许异常传播,以便调试器在抛出位置中断是有用的。然后就可以看到局部变量的值,等等。我更想知道这是设计造成的还是我遗漏了什么,因为这与C#和VB的工作方式不同。不幸的是,如果不在异常设置中为该异常显式启用中断触发,我认为这是不可能的。异常助手的文档指定它可用于VB.Net和C#,因此我假设它也恰好与F#一起正常工作,这只是一个巧合,不应该假设它支持等效功能。OK。我不想为异常在抛出时中断,而是为未处理的异常在抛出时中断。我想这只是F#的工作方式,我很满意,只是确保我没有遗漏任何东西。
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