Windows Mobile 应用程序避免了未经处理的异常处理

本文关键字:处理 异常处理 Mobile 应用程序 Windows | 更新日期: 2023-09-27 18:31:01

我们在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。

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

Windows Mobile 应用程序避免了未经处理的异常处理

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

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

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

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

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

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());
}

参考: 应用程序.线程异常

@Mitch 小麦我相信我们在这里谈论的是使用.NET CF 3.5的Windows Mobile 6。.NET CF 不支持 ThreadException,因此您不能这样做。