【问题标题】:F# Lazy and ExceptionsF# 惰性和异常
【发布时间】:2014-08-25 06:35:29
【问题描述】:

举个例子:

let value = try (lazy raise(Exception())).Value with | _ -> false

为什么在 try 块中没有捕获到异常。请记住,我提出了这样的异常来证明这个例子。关键是,如果我有一个抛出异常的惰性代码,它似乎无法在 try 块中捕获。我是否必须在匹配异常时具体说明,还是必须在惰性表达式本身中捕获异常?

【问题讨论】:

  • 好像你改变了你的问题,你的例子不再像你描述的那样了
  • 自发布问题以来,我没有更改任何内容。
  • 奇怪...因为此代码将按预期工作(查看所有答案)

标签: exception f# lazy-evaluation


【解决方案1】:

以下打印异常和错误值。

let value = 
    try 
        (lazy raise(System.Exception())).Value 
    with  
        | exn -> printfn "%A" exn
                 false
printfn "%A" value

【讨论】:

  • 您使用的是什么版本的 F#?我完全按原样复制了您的代码,但仍然引发异常。我正在使用 Visual Studio 2012 Professional。
【解决方案2】:

我无法代表您的结果。你在看什么?

let value = 
    try 
        (lazy raise(Exception())).Value 
        true
    with
     | ex -> 
         printfn "got exception"; 
         false

给我

got exception

val value : bool = false

编辑:

添加调试图片

【讨论】:

  • 我复制了您的代码并按原样运行。当我使用调试器运行时,异常被抛出并且没有被捕获,但是如果我在没有调试器的情况下运行,一切都很好。这是预期的行为还是我错过了什么?
  • @StalinPimentel 我不确定你在做什么,但它确实工作得很好。我附上了一张图片,显示调试器捕获异常
  • 哦,我明白了... F# 有时会向您显示抛出的异常 - 只需继续按 F5,您就会看到异常被捕获;)(我认为这在以后的版本中有所改变- 但是 VS2010 中的 F# 2 有这个 problem)
  • @CarstenKönig,这完全符合您的建议。再次按 F5 继续执行。我更习惯于 C#,所以我认为这就结束了。顺便说一句,我使用的是 VS 2012,我想它是 F# 3.0 附带的。我会在 VS 2013 中尝试一下。
  • @StalinPimentel 可能 - 我现在使用 VS2013,我已经有一段时间没有看到这样的东西了 - 但我曾经在调试 Socket 代码时经常断开连接时让我毛骨悚然;)
猜你喜欢
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
相关资源
最近更新 更多