如何在try-with表达式的with分支内设置断点?
解决F#调试器无法在异常处理块暂停的问题
嘿,这个问题我之前折腾过好一会儿,咱们来一步步搞清楚问题出在哪,以及怎么解决:
核心原因
默认情况下,调试器只会在未被捕获的异常抛出时自动暂停。你的代码里异常被with块成功捕获了,所以调试器不会主动停在printfn "WTF"这一行——它觉得“异常已经被处理了,没必要打断你”。
针对Visual Studio的解决办法
方法1:手动打断点(最直接)
直接点击printfn "WTF"行号旁边的空白区域,出现红色圆点(断点标记)。之后启动调试(F5),程序执行到这一行时就会自动暂停,完全符合你的需求。
方法2:调整调试器异常设置(按需选择)
如果你想在异常抛出时就暂停,或者确保捕获后的处理逻辑能被调试到,可以这么做:
- 按下
Ctrl+Alt+E打开「异常设置」窗口 - 找到「Common Language Runtime Exceptions」→ 展开后定位到
System.InvalidOperationException- 勾选「Thrown」:异常一被抛出就暂停(不管有没有被捕获)
- 勾选「User-unhandled」:只有当异常没被你的代码捕获时才暂停
- 另外,如果打了断点还是没反应,去「工具→选项→调试→常规」里取消勾选「启用仅我的代码」——这个设置有时候会让调试器跳过你自己写的处理块逻辑。
针对LinqPad的解决办法
LinqPad的调试逻辑和VS类似,但要注意两个关键点:
- 必须点击Debug按钮(不是普通的Run按钮)启动调试模式
- 和VS一样,手动在
printfn "WTF"行左侧打断点(点击空白处出现红点),调试运行时就会在该行暂停。
额外检查
确认你的代码确实会执行到处理块:比如有没有可能try块里的raise语句没被执行到?不过你的代码是直接try raise (...) with ...,所以肯定会进入with块,这一步应该没问题。
内容的提问来源于stack exchange,提问作者Pavel Voronin




