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 アプリケーションであり、主に Motorola MC65 デバイスで実行されますが、一部は Psion EP10 デバイスで実行され、一部は他のデバイスでも実行されます (したがって、デバイス固有である可能性は低いです)。

アプリケーションはすべて SQLCe とマージ レプリケーションを使用します。それらの多くは、フォームに表示するためにサードパーティのコントロールを使用しています。それらはすべて、さまざまな目的で一定量の PInvoking を使用します。

クラッシュ自体は、アプリケーションの特定の時点で発生しているようには見えず、その場合でもそれほど頻繁ではありませんが、ログを確認すると、アプリケーションが進行状況 (メモリ使用量やその他のさまざまな有用な詳細を含む) をログに記録していることがわかります。その後、単純に終了します。何の記録もなく。

4

3 に答える 3

1

「このエラー処理方法にもかかわらず、終了、未処理の例外、または LOG MAIN 例外を記録せずに、アプリケーションが単に終了したというログをユーザーから受け取りました。」

.NET 例外ハンドラーによって処理されない例外があります。たとえば、アプリ関数の使用法によって参照されるネイティブ コードがクラッシュする可能性があります。

もっと単純な問題がある可能性があります。デバイスのリソースが少なくなると、休止状態のメッセージ ( http://msdn.microsoft.com/en-us/library/aa925791.aspx ) がすべてのウィンドウに送信されます。プロセスがリソースを解放せず、この要求に応答しない場合、ブロードキャスト後にリソースが少ないままであれば、OS によって強制終了される可能性があります。

私はすでにこれについていくつかのサポート コールを受けており (私は現在 9 年間 WM/PPC サポートを行っています)、デバイスのリソース使用量を下げ、WM_HIBERNATE ハンドラーを実装することで修正されました。

于 2013-09-13T04:14:46.103 に答える
0

同様の方法で未処理の Thread 例外をキャッチする必要もあります。

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 に答える