首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找Microsoft.FSharp.Control.Trampoline引发的异常

查找Microsoft.FSharp.Control.Trampoline引发的异常
EN

Stack Overflow用户
提问于 2016-02-12 17:55:19
回答 1查看 176关注 0票数 6

我负责一个F# WPF应用程序。当一个未处理的异常发生时它会给我发电子邮件。大多数情况下,我能够从错误消息和堆栈跟踪中识别异常的来源。但是,我偶尔会收到如下消息,它不包括堆栈跟踪中的任何代码。

代码语言:javascript
复制
Summary:
Object reference not set to an instance of an object.
--------------
Details:

System.NullReferenceException: 
Object reference not set to an instance of an object.
   at Microsoft.FSharp.Control.CancellationTokenOps.Start@1234-1.Invoke(Exception e)
   at <StartupCode$FSharp-Core>.$Control.loop@435-40(Trampoline this, FSharpFunc`2 action)
   at Microsoft.FSharp.Control.Trampoline.ExecuteAction(FSharpFunc`2 firstAction)
   at Microsoft.FSharp.Control.TrampolineHolder.Protect(FSharpFunc`2 firstAction)
   at <StartupCode$FSharp-Core>.$Control.-ctor@520-1.Invoke(Object state)
   at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

这个堆栈跟踪中有哪些线索可以帮助我识别这个异常的来源?

例如,我假设原始异常是在async计算中抛出的。(我的异步代码大部分是基于F#异步块的。)我的NullReferenceException可能发生在async块的任何地方吗?我注意到异常发生在Start()方法中。还是真的是这样?该Start()方法接受一个Exception实例,因此可能在此之前抛出了异常。这能告诉我什么吗?我想知道是否有人对Microsoft.FSharp.Control.Trampoline足够熟悉,从而为我指明了正确的方向。

顺便说一句,在我的错误处理代码中,我在检查所有InnerExceptions和处理AggregateExceptions__时都很小心。所以我认为这是异常实例中所有可用的信息,但我可能错了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-12 18:50:43

我做了个快速测试。下面的控制台程序生成相同的堆栈跟踪。

代码语言:javascript
复制
[<EntryPoint>]
let main argv = 

    async { printfn "Inside async block."
            let o = null
            o.GetType() |> ignore
    } |> Async.Start

    System.Console.ReadKey(true) |> ignore
    0 // return an integer exit code

这告诉我以下几点:

  1. 神秘的异常发生在异步块中。
  2. 它可能发生在异步块中的任何地方。
  3. 诊断的唯一方法是改进异步块(可能是使用Async.Catch)周围的错误处理,重新部署新版本的应用程序,然后等待它再次发生。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35369199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档