Как использовать ThreadException? - PullRequest
3 голосов
/ 01 февраля 2011

Я пытался использовать

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();
        }
    }
}

Ответы [ 2 ]

9 голосов
/ 01 февраля 2011

Ваш код работает нормально, я не могу придумать много возможных сбоев. За исключением одного, существует проблема во взаимодействии между отладчиком и Windows SEH при отладке 32-разрядного кода в 64-разрядной операционной системе до Windows 8. Это может привести к проглатыванию исключений без какой-либо диагностики когда они происходят в событии Load формы или переопределении метода OnLoad (). Проверьте связанный пост на наличие обходных путей, самый простой - Project + Properties, вкладка Build, Platform Target = AnyCPU, снимите флажок «Предпочитать 32-битный», если вы его видите.

Как правило, вы делаете соответствующую вещь, не позволяя обработке исключений по умолчанию для Application.ThreadException отображать диалоговое окно. Но будь проще, делай так:

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

Теперь вам больше не нужно беспокоиться о ThreadException, все исключения вызывают обработчик события AppDomain.UnhandledException. И #if вокруг кода все еще позволяет вам отлаживать необработанное исключение, отладчик автоматически остановится, когда возникнет исключение.

Добавьте это к методу UnhandledException, чтобы предотвратить отображение уведомления о сбое Windows:

        Environment.Exit(1);
2 голосов
/ 01 февраля 2011

Вы не показали, куда вы бросаете ArgumentNullException. Я предполагаю, что это либо внутри конструктора MediaPlayerForm (что означает, что это до начала цикла сообщений), либо в другом потоке. Application.ThreadException обрабатывает только исключения, обнаруженные в потоках Windows Forms, выполняющих циклы сообщений.

...