1

我们对 Windows Mobile 应用程序进行了错误处理,类似于以下内容:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [MTAThread]
    static void Main()
    {
        try
        {
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
            LogWriter.WriteDebugLog("******* Application Start *******");
            Application.Run(new Form1());
        }
        catch (Exception ex)
        {
            LogWriter.WriteDebugLog("LOG MAIN: " + ex.Message + "\r\nTrace: " + ex.StackTrace);
            MessageBox.Show("An unexpected error has occured, please try again. If the problem continues please contact application provider.", "Fatal Error");
        }
        finally
        {
            AppDomain.CurrentDomain.UnhandledException -= new UnhandledExceptionEventHandler(OnUnhandledException);
            try
            {
                //System.Diagnostics.Process proc = System.Diagnostics.Process.GetCurrentProcess();
                //proc.Kill();
            }
            catch { }
            LogWriter.WriteDebugLog("******* Application Exit *******");
        }
    }

    public static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        string application_name = sender.ToString();
        Exception except = (Exception)e.ExceptionObject;
        string errormessage = "Application " + application_name + " [ Exception " + except.Message + " ]" + Environment.NewLine + except.StackTrace;

        //MessageBox.Show(errormessage, "Fatal Error");
        LogWriter.WriteDebugLog(errormessage);
        AppDomain.CurrentDomain.UnhandledException -= new UnhandledExceptionEventHandler(OnUnhandledException);
    }
}

尽管有这种错误处理方法,我们还是收到了来自用户的日志,其中应用程序只是终止而没有记录退出或未处理的异常或 LOG MAIN 异常。

我一直试图通过创建一个非常简单的应用程序并抛出各种类型的异常策略来杀死应用程序来重现这一点,但没有成功。每次我抛出任何类型的异常时,它似乎都会被上面的代码捕获。

如果有人对哪些类型的问题可能会跳过此错误处理有任何想法,我们将不胜感激,因为这可能会推动我们的调查向前发展。

亲切的问候,格雷厄姆。


编辑:如果它与要求相关,请提供更多信息。

有问题的应用程序是各种各样的 Windows Mobile 6.5 应用程序,主要在摩托罗拉 MC65 设备上运行,虽然有些在 Psion EP10 设备上,有些也在其他设备上(因此不太可能是特定于设备的)。

这些应用程序都使用 SQLCe 和合并复制。他们中的许多人使用第三方控件在表单上显示。他们都为不同的目的使用了一定数量的 PInvoking。

崩溃本身似乎不会在应用程序的任何特定点发生,即使在那时也不会经常发生,但是当我们查看日志时,我们会看到应用程序记录了它的进度(包括内存使用情况和各种其他有用的细节),然后它就简单地终止了没有任何记录。

4

3 回答 3

1

“尽管采用了这种错误处理方法,但我们收到了来自用户的日志,其中应用程序只是终止而没有记录退出或未处理的异常或 LOG MAIN 异常。”

有任何 .NET excption 处理程序无法处理的异常:例如,您的应用程序函数使用引用的本机代码可能会崩溃。

可能您有一个更简单的问题:如果设备资源不足,它会向所有窗口发送休眠消息 ( http://msdn.microsoft.com/en-us/library/aa925791.aspx )。如果一个进程没有释放资源并响应这个请求,如果在广播后资源仍然很低,它可能会被操作系统杀死。

我已经接到了一些关于这个问题的支持电话(我现在做 WM/PPC 支持 9 年了)并且通过降低设备上的资源使用和实现 WM_HIBERNATE 处理程序来修复它们。

于 2013-09-13T04:14:46.103 回答
0

@Mitch Wheat 我相信我们在这里谈论的是使用 .NET CF 3.5 的 Windows Mobile 6 .NET CF 不支持 ThreadException,所以你不能这样做。

于 2013-10-17T20:50:04.733 回答
0

您还需要以类似的方式捕获未处理的线程异常:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);


    Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    Application.Run(new Form1());
}

参考:Application.ThreadException

于 2013-09-12T14:44:51.187 回答