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

时间:2013-09-12 14:41:43

标签: c# windows-mobile unhandled-exception

我们的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应用程序,主要运行在Motorola MC65设备上,虽然有些是在Psion EP10设备上,有些也在其他设备上(因此它不太可能是特定于设备的)。 / p>

应用程序都使用SQLCe和Merge Replication。他们中的许多人使用第三方控件在表单上显示。所有这些都使用一定数量的PInvoking用于不同的目的。

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

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