Domanda

Ho provato a usare

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

Ma quando lo faccio

throw new ArgumentNullException("playlist is empty");

Non ho niente. Scommetto che mi manca qualcosa di molto ovvio.

Ecco il mio codice.

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();
        }
    }
}
È stato utile?

Soluzione

Il tuo codice funziona bene, non ci sono molte possibili modalità di errore a cui riesco a pensare. Tranne uno, c'è un problema Nell'interazione tra il debugger e Windows SEH quando si esegue il debug di codice a 32 bit su un sistema operativo a 64 bit prima di Windows 8. Ciò può causare ingrandite eccezioni senza alcuna diagnostica quando si verificano nell'evento di carico del modulo o Onload () Metodo sovraccarico. Controlla il post collegato per le soluzioni alternative, il più semplice è Progetto + Proprietà, Build Tab, Platform Target = Anycpu, Usct "Prefer a 32 bit" se lo vedi.

In generale, stai facendo la cosa appropriata non lasciando che la gestione delle eccezioni predefinite di un'applicazione.ThreadException visualizza la finestra di dialogo. Ma mantienilo semplice, fallo in questo modo:

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

Ora non devi più preoccuparti di un threadException, tutte le eccezioni innescano l'appdomain.UnhandledException Event Handler. E il #F sul codice ti consente ancora di eseguire il debug di un'eccezione non gestita, il debugger si fermerà automaticamente quando viene sollevata l'eccezione.

Aggiungi questo al metodo di UnhandledException per evitare che la notifica di Crash di Windows venga visualizzata:

        Environment.Exit(1);

Altri suggerimenti

Non hai mostrato dove stai lanciando il ArgumentNullException. La mia ipotesi è che sia all'interno del costruttore di MediaPlayerForm (Il che significa che è prima dell'inizio del ciclo del messaggio) o è in un thread diverso. Application.ThreadException Gestisce solo le eccezioni catturate dai thread di finestre che eseguono loop di messaggi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top