次のような 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 デバイスで実行され、一部は他のデバイスでも実行されます (したがって、デバイス固有である可能性は低いです)。
アプリケーションはすべて SQLCe とマージ レプリケーションを使用します。それらの多くは、フォームに表示するためにサードパーティのコントロールを使用しています。それらはすべて、さまざまな目的で一定量の PInvoking を使用します。
クラッシュ自体は、アプリケーションの特定の時点で発生しているようには見えず、その場合でもそれほど頻繁ではありませんが、ログを確認すると、アプリケーションが進行状況 (メモリ使用量やその他のさまざまな有用な詳細を含む) をログに記録していることがわかります。その後、単純に終了します。何の記録もなく。