0

MonoMac で OSX 用の簡単なアプリケーションを開発しています。アプリケーションで未処理の例外が発生した場合、次の方法でキャッチします。

AppDomain.CurrentDomain.UnhandledException += (送信者, e) => Unhandled(e.ExceptionObject as Exception);

関数 Unhandled() 内で、例外をログに記録し、モーダル ウィンドウを実行して、問題が発生したことをユーザーに通知します。

次に、アプリケーションのどこかで通常の例外をスローして、これをテストします。クラッシュ レポート ウィンドウが正常に表示され、エラーがログに記録されます。

しかし、このウィンドウが閉じられた後、アプリケーションが終了することが予想されます。これは、エラーをキャッチしていなかった場合と同様です。そうではありません。アプリケーションのメイン ウィンドウとドック アイコンは表示されたままですが、ウィンドウは完全に固定されています。

上記のコード行を削除すると、アプリケーションがクラッシュしたときにアプリケーションが完全に閉じます。

次のように呼び出して、アプリケーションを強制的に終了させようとします。

NSApplication.SharedApplication.Terminate(myAppDelegate);

しかし、これはまったく何もしないようです。アプリケーションの [Quit] ボタンでまったく同じコード行を使用すると、期待どおりに動作するため、未処理の例外をキャッチした後のアプリケーションの状態には何か特別なものがあるはずです。しかし、何?

念のため、AppDelegate で次をオーバーライドしましたが、違いはないようです。

public override NSApplicationTerminateReply ApplicationShouldTerminate (NSApplication sender)
{
    return NSApplicationTerminateReply.Now;
}

モーダル フォームを表示すると、アプリケーションの状態に何らかの影響があるのではないかと考えましたが、テストした結果、モーダル フォームを表示するかどうかに違いはないことがわかりました。閉じる代わりにメイン ウィンドウをフリーズしたままにします。

編集:これをテストするときに何か間違ったことをしたに違いありません。エラーフォームを表示しなければ、実際には正常に機能します。

何か案は?

4

1 に答える 1

1

正確な答えはありません。また、コメントは私のコード サンプルを保持しません。しかし、概念的には私のアプリケーションでほぼ同じことを行っており、問題なく動作していると言えます。私のコード:

private static void OnException(Exception ex)
{
    new NSObject().InvokeOnMainThread(() => {
        try 
        {
            using (ErrorWindowController frmErrorMessage = new ErrorWindowController(ex)) 
            {
                Console.WriteLine(ex);
                    NSApplication.SharedApplication.RunModalForWindow(frmErrorMessage.Window);
            }
        } 
        finally 
        {
                NSApplication.SharedApplication.Terminate(NSApplication.SharedApplication);
        }
    });
}

編集:

ウィンドウを閉じるときにモーダル セッションを停止していることを確認してください。そうしないと、への呼び出しRunModalForWindowが返されません。

次のようなボタンを使用してモーダル ウィンドウを閉じます。

partial void butClose_Click(NSObject sender)
{
    this.Window.OrderOut(sender);
    this.Window.Close();

    NSApplication.SharedApplication.StopModal();
}
于 2013-04-17T13:46:41.817 に答える