Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Evento Application.ThreadException

 

Publicado: octubre de 2016

Se desencadena cuando se produce una excepción no controlada.

Espacio de nombres:   System.Windows.Forms
Ensamblado:  System.Windows.Forms (en System.Windows.Forms.dll)

public static event ThreadExceptionEventHandler ThreadException

Este evento permite que la aplicación de formularios Windows Forms para controlar no controlada las excepciones que se producen en los subprocesos de formularios Windows Forms. Asocie los controladores de eventos para el ThreadException eventos para tratar estas excepciones, lo que dejarán la aplicación en un estado desconocido. Siempre que sea posible, deben controlar excepciones de un bloque de control de excepciones estructurado.

Puede cambiar si se utiliza esta devolución de llamada de excepciones no controladas de subproceso de Windows Forms estableciendo SetUnhandledExceptionMode. Para detectar excepciones que se producen en subprocesos que no se crean y propiedad de formularios Windows Forms, use la UnhandledException controlador de eventos.

System_CAPS_noteNota

Para garantizar que no faltan activaciones de este evento, debe asociar un controlador antes de llamar a Application.Run.

System_CAPS_cautionPrecaución

Puesto que es un evento estático, debe desasociar los controladores de eventos cuando se desecha la aplicación o dará como resultado pérdidas de memoria.

En el ejemplo de código siguiente se establece controladores de eventos para las excepciones que se producen en los subprocesos de formularios Windows Forms y excepciones que se producen en otros subprocesos. Establece SetUnhandledExceptionMode para que todas las excepciones se controlan mediante la aplicación, independientemente de la configuración en el archivo de configuración de usuario de la aplicación. Usa el ThreadException eventos para controlar las excepciones del subproceso de interfaz de usuario y UnhandledException eventos para controlar las excepciones del subproceso de interfaz de usuario no. Puesto que UnhandledException no puede impedir que una aplicación de finalización, el ejemplo simplemente registra el error en el registro de eventos de aplicación antes de la finalización.

En este ejemplo se supone que ha definido dos Button controles, button1 y button2, en su Form clase.

Thread newThread = null;

// Starts the application. 
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]
public static void Main(string[] args)
{
    // Add the event handler for handling UI thread exceptions to the event.
    Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_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(CurrentDomain_UnhandledException);

    // Runs the application.
    Application.Run(new ErrorHandlerForm());
}

// Programs the button to throw an exception when clicked.
private void button1_Click(object sender, System.EventArgs e)
{
    throw new ArgumentException("The parameter was invalid");
}

// Start a new thread, separate from Windows Forms, that will throw an exception.
private void button2_Click(object sender, System.EventArgs e)
{
    ThreadStart newThreadStart = new ThreadStart(newThread_Execute);
    newThread = new Thread(newThreadStart);
    newThread.Start();
}

// The thread we start up to demonstrate non-UI exception handling. 
void newThread_Execute()
{
    throw new Exception("The method or operation is not implemented.");
}

// Handle the UI exceptions by showing a dialog box, and asking the user whether
// or not they wish to abort execution.
private static void Form1_UIThreadException(object sender, ThreadExceptionEventArgs t)
{
    DialogResult result = DialogResult.Cancel;
    try
    {
        result = ShowThreadExceptionDialog("Windows Forms Error", t.Exception);
    }
    catch
    {
        try
        {
            MessageBox.Show("Fatal Windows Forms Error",
                "Fatal Windows Forms Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
        }
        finally
        {
            Application.Exit();
        }
    }

    // Exits the program when the user clicks Abort.
    if (result == DialogResult.Abort)
        Application.Exit();
}

// Handle the UI exceptions by showing a dialog box, and asking the user whether
// or not they wish to abort execution.
// NOTE: This exception cannot be kept from terminating the application - it can only 
// log the event, and inform the user about it. 
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    try
    {
        Exception ex = (Exception)e.ExceptionObject;
        string errorMsg = "An application error occurred. Please contact the adminstrator " +
            "with the following information:\n\n";

        // Since we can't prevent the app from terminating, log this to the event log.
        if (!EventLog.SourceExists("ThreadException"))
        {
            EventLog.CreateEventSource("ThreadException", "Application");
        }

        // Create an EventLog instance and assign its source.
        EventLog myLog = new EventLog();
        myLog.Source = "ThreadException";
        myLog.WriteEntry(errorMsg + ex.Message + "\n\nStack Trace:\n" + ex.StackTrace);
    }
    catch (Exception exc)
    {
        try
        {
            MessageBox.Show("Fatal Non-UI Error",
                "Fatal Non-UI Error. Could not write the error to the event log. Reason: "
                + exc.Message, MessageBoxButtons.OK, MessageBoxIcon.Stop);
        }
        finally
        {
            Application.Exit();
        }
    }
}

// Creates the error message and displays it.
private static DialogResult ShowThreadExceptionDialog(string title, Exception e)
{
    string errorMsg = "An application error occurred. Please contact the adminstrator " +
        "with the following information:\n\n";
    errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace;
    return MessageBox.Show(errorMsg, title, MessageBoxButtons.AbortRetryIgnore,
        MessageBoxIcon.Stop);
}

SecurityPermission

for the immediate caller to call unmanaged code when adding a handler to this event. Associated enumeration: F:System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode

.NET Framework
Disponible desde 1.1
Volver al principio
Mostrar: