3

使ってみました

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx#Y399

しかし、私がこれを行うとき

throw new ArgumentNullException("playlist is empty");

何も得られません。私は非常に明白な何かを見逃しているに違いない。

これが私のコードです。

using System;
using System.Security.Permissions;
using System.Windows.Forms;
using System.Threading;

namespace MediaPlayer.NET
{
    internal static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]
        private static void Main()
        {
            // Add the event handler for handling UI thread exceptions to the event.
            Application.ThreadException += new ThreadExceptionEventHandler(UIThreadException);

            // Set the unhandled exception mode to force all Windows Forms errors to go through
            // our handler.
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

            // Add the event handler for handling non-UI thread exceptions to the event. 
            AppDomain.CurrentDomain.UnhandledException +=
                new UnhandledExceptionEventHandler(UnhandledException);

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MediaPlayerForm());
        }

        private static void UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            MessageBox.Show("UnhandledException!!!!");
        }

        private static void UIThreadException(object sender, ThreadExceptionEventArgs t)
        {
            MessageBox.Show("UIThreadException!!!!",
                            "UIThreadException!!!!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
            Application.Exit();
        }
    }
}
4

2 に答える 2

10

あなたのコードはうまく機能します、私が考えることができる多くの可能な失敗モードはありません。1つを除いて、 Windows 8より前の64ビットオペレーティングシステムで32ビットコードをデバッグする場合、デバッガーとWindows SEHの間の相互作用に問題があります。これにより、フォームで例外が発生したときに、診断なしで例外が飲み込まれる可能性があります。 LoadイベントまたはOnLoad()メソッドのオーバーライド。リンクされた投稿で回避策を確認してください。最も簡単なのは、[プロジェクト+プロパティ]、[ビルド]タブ、[プラットフォームターゲット] = AnyCPUです。表示されている場合は、[32ビットを優先]のチェックを外してください。

一般に、Application.ThreadExceptionのデフォルトの例外処理でダイアログが表示されないようにすることで、適切な処理を実行しています。ただし、シンプルに保ち、次のようにします。

#if (!DEBUG)
      Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
#endif

これで、ThreadExceptionについて心配する必要がなくなり、すべての例外がAppDomain.UnhandledExceptionイベントハンドラーをトリガーします。また、コードの周りの#ifで未処理の例外をデバッグできる場合でも、例外が発生するとデバッガーは自動的に停止します。

これをUnhandledExceptionメソッドに追加して、Windowsのクラッシュ通知が表示されないようにします。

        Environment.Exit(1);
于 2011-02-01T16:41:16.187 に答える
2

を投げている場所を表示していませんArgumentNullException。私の推測では、それはのコンストラクター内MediaPlayerForm(つまり、メッセージループが開始される前)にあるか、別のスレッドにあると思います。Application.ThreadExceptionメッセージループを実行しているWindowsフォームスレッドでキャッチされた例外のみを処理します。

于 2011-02-01T16:03:12.593 に答える