Las excepciones no atrapadas en versión de lanzamiento (aplicación de escritorio WinForm, C #, VS 2010)

StackOverflow https://stackoverflow.com/questions/3877671

Pregunta

he desarrollado una aplicación de escritorio, es casi terminado, pero todavía contiene algunos errores que estoy eliminando.

Yo uso un [try ... catch] generales bloque envuelto alrededor de mi solicitud

[STAThread]
static void Main()
{
   try
   {
       program = new Program();
       // ...
   }
   catch (Exception x)
   { 
       // ...
       MessageBox.Show(
          message,
          Resources.MESSAGEBOX_ERROR_CRASH_Caption,
          MessageBoxButtons.OK,
          MessageBoxIcon.Error);
   } 
}

ser mi constructor de la clase de programa:

public Program()
{
    // [...]
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    // [...]
    frmLogon = new Logon();            
    Application.Run(frmLogon);
}        

para asegurarse de que cualquier excepción no controlada de burbujas voluntad todo el camino hasta la pila y es al menos responda con cierta cuadro de mensaje comunicativo.

Funciona bien cuando corro la aplicación bajo estudio (modo de depuración) Visual, pero cuando se desplegué e instalado en mi PC, no lo hace - que es lo que me pasa cuando el error (que ya me he identificado, por cierto) hace que se lea de una matriz nula

text alt

¿Por qué? Me desconcierta realmente. ¿Por qué era "no controlada"? Tenía entendido que try ... catch debería funcionar independientemente de si se trata de la liberación o el modo de depuración, de lo contrario lo que sería el punto.

¿Fue útil?

Solución

Esto es un poco viejo, pero si todavía necesita una solución, tiene que manejar algunos eventos, que encierra toda la cosa en un intento de captura no funcionará. Hacer algo como esto:

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        AppDomain.CurrentDomain.UnhandledException += ProcessAppException;
        Application.ThreadException += ProcessThrException;
        Application.Run(new MainForm());
    }

    private static void ProcessAppException(object sender, UnhandledExceptionEventArgs e)
    {
        XtraFunctions.LogException((Exception)e.ExceptionObject);
        throw (Exception)e.ExceptionObject; //MessageBox in your case.
    }

    private static void ProcessThrException(object sender, ThreadExceptionEventArgs e)
    {
        XtraFunctions.LogException(e.Exception);
        throw e.Exception; //MessageBox in your case.
    }

Cuando una excepción no se detecta, que pasará a través de uno de los antes de mostrar el diálogo de excepción. Por lo tanto usted tiene la opción de anular y mostrar un buen mensaje de su elección.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top