Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么VisualStudio2010调试器不拾取调试符号来处理F#序列中的异常?_F#_Visual Studio Debugging - Fatal编程技术网

为什么VisualStudio2010调试器不拾取调试符号来处理F#序列中的异常?

为什么VisualStudio2010调试器不拾取调试符号来处理F#序列中的异常?,f#,visual-studio-debugging,F#,Visual Studio Debugging,在Visual Studio 2010中,以下F#序列在发布模式下按预期工作(忽略UnauthorizedAccessException),但在调试模式下不能正常工作(在UnauthorizedAccessException上中断,即使我设置了“公共语言运行时异常:抛出=false,用户未处理=true”) 但是,如果我不将getAuthorizedItems函数嵌套在序列中,而是将其放在模块级,则调试器可以正常工作 注: 我已经查看了生成的IL代码,异常处理程序在这两种情况下都应该在那里(没有

在Visual Studio 2010中,以下F#序列在发布模式下按预期工作(忽略UnauthorizedAccessException),但在调试模式下不能正常工作(在UnauthorizedAccessException上中断,即使我设置了“公共语言运行时异常:抛出=false,用户未处理=true”)

但是,如果我不将getAuthorizedItems函数嵌套在序列中,而是将其放在模块级,则调试器可以正常工作

注:

  • 我已经查看了生成的IL代码,异常处理程序在这两种情况下都应该在那里(没有以任何方式进行修改/优化)
  • 我知道System.Core必须预加载才能在调试器中正确显示序列,但这与我的问题无关
  • 在F#中,在调试时是否有处理顺序异常的特殊规则

    编辑
    在我报告了这个问题后,F#团队很快开始跟踪它。这似乎是一个与以下事实相关的小错误:在调试模式下,生成的一些代码被标记为“外部代码”,即使它是用户代码。目前,人们可以使用pad答案中建议的解决方法。另一个解决方法是关闭VS调试选项中的“仅启用我的代码”。

    我可以在没有安装VS2010 SP1的情况下,使用F#2.0/.NET 4.0在我的机器上重现该错误。这可能是因为@svick无法重现该漏洞,所以该漏洞已在VS2010 SP1中修复。事实证明,在VS2010 SP1更新后,此错误仍然存在

    我认为处理序列表达式中嵌套函数中的异常是一个错误,更改嵌套函数以捕获任何异常不会影响行为:

    let getAuthorizedItems getItems dir =
        try getItems dir
        with ex -> [||]
    
    这是一个小错误;您可以通过多种方式绕过它:

    • 它在发布模式下工作,在fsi内部,甚至在VisualStudio外部的调试模式下运行
    • 将嵌套函数声明为
      inline
      可使其在调试模式下工作
    • 启用
      优化代码
      选项可使其再次工作
    • 不在
      seq
      中使用嵌套函数也有帮助

    如果尚未修复,我建议您在microsoft.com的fsbug上提交一份bug报告。

    我想知道是否发生了括号错误,它认为您正在执行
    getAuthorizedItems(Directory.GetFiles dir)
    ,这将导致观察到的行为,但我只能这么想of@JohnPalmer,我认为这不会导致观察到的行为。它甚至不会编译。@John:svick是对的。起初我也有同样的怀疑,并尝试了一下。当然,它不会编译。你描述的行为并不是我的行为。您的代码似乎工作正常,调试器没有中断。@svick:这很奇怪。我可以用几种不同的解决方案重现它。代码必须位于项目中,而不是fsi;)在调试模式下,使用“公共语言运行时异常:抛出=false,用户未处理=true”,并且必须针对具有受限访问权限的文件夹进行测试,例如“C:\Users\mycompany”。无论如何,感谢您的测试。我已经安装了VS2010 Premium Sp1,因此service pack不是错误的原因。通过内联绕过这个bug是一个很好的解决方法。所以这个bug仍然出现在当前的F#版本中。请慢慢报告:)@pad,我在VS2010中试用过,但我也安装了VS11DP和.Net 4.5 DP。
    let getAuthorizedItems getItems dir =
        try getItems dir
        with ex -> [||]