为什么Program.Main没有出现在崩溃堆栈中

时间:2011-09-16 20:49:20

标签: c# exception-handling clickonce stack-trace

大家

我正在编写一个C#应用程序来处理主程序中所有未捕获的异常:

    static void Main()
    {
        try
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainFrame());                     
        }
        catch (Exception e)
        {
            CrashReporter.Report(e);
        }
    }

当我从visual studio运行应用程序(甚至是Release版本)时,它可以工作。 但是当我将其发布为click-once并安装时,在大多数情况下,异常将不会在Main函数中捕获。异常堆栈是这样的:

...
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

即。主要甚至不在堆栈中...... 为什么会这样? 有没有办法做这样的'抓住所有'的事情? 为什么发布与本地构建行为不同?


提前致谢 哔叽

3 个答案:

答案 0 :(得分:2)

我希望主线程上没有抛出异常。

显然,其他线程在堆栈上没有Main(因为线程函数是它们的入口点)。

当您获得'nativewindow'回调时,这意味着本机窗口在不同的线程上运行。如果需要代码在一个线程上运行,您可能希望使用消息传递或使用“调用”来中继回调。

答案 1 :(得分:2)

要回答你的有没有办法做这样的'抓住所有'?问题,请查看AppDomain.UnhandledException

  

此事件提供未捕获异常的通知。它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。如果有足够的有关应用程序状态的信息,则可以采取其他措施 - 例如保存程序数据以便以后恢复。建议小心,因为在未处理异常时程序数据可能会损坏。 ...

Application.ThreadException事件。

  

此事件允许Windows窗体应用程序处理Windows窗体线程中出现的其他未处理的异常。将事件处理程序附加到ThreadException事件以处理这些异常,这将使您的应用程序处于未知状态。在可能的情况下,异常应由结构化异常处理块处理。 ...

答案 2 :(得分:0)

窗口回调中抛出了异常;那些是在事件派发线程上调用的。您看到的堆栈跟踪是来自该线程的堆栈跟踪,而不是程序启动的主要跟踪。