我负责 F#WPF应用。当发生未处理的异常时,它会通过电子邮件发送给我。大多数情况下,我能够从错误消息和堆栈跟踪中识别异常的来源。但是,我偶尔会收到如下消息,其中不包含堆栈跟踪中的任何代码。
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
。所以我认为这是Exception实例中提供的所有信息,但我可能是错的。
答案 0 :(得分:4)
我做了一个快速测试。以下Console程序生成相同的堆栈跟踪。
[<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
告诉我以下内容: