我们的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用于不同的目的。
崩溃本身似乎并未在应用程序的任何特定点发生,即使在那时也不常发生,但是当我们查看日志时,我们会看到应用程序记录其进度(包括内存使用情况和各种其他有用的详细信息),然后它只是终止而没有任何记录。
答案 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());
}
答案 2 :(得分:0)
@Mitch Wheat 我相信我们在这里谈论使用.NET CF 3.5的Windows Mobile 6 .NET CF不支持ThreadException,所以你不能这样做。