.net vb.net visual-studio visual-studio-2008 .net-3.5

.net - El bloque de captura no capta la excepción



vb.net visual-studio (4)

El evento Form.Load se comporta de la misma manera que la mayoría de los demás eventos en Windows Forms. Se envía mediante el bucle de mensaje, en este caso cuando Windows envía el mensaje WM_SHOWWINDOW. Hay un manejador de excepciones en el bucle de mensajes que impide que una excepción no detectada termine el bucle de mensajes. Ese controlador de excepción genera el evento Application.ThreadEvent. El controlador de eventos predeterminado muestra el cuadro de diálogo de excepción no controlada.

Para resumir, no se puede capturar una excepción planteada en el evento Load en su botón Click handler. Aparte de detectar y manejar excepciones en el controlador de eventos de carga en sí, muy difícil de hacer bien, le recomiendo que agregue un método público al formulario. Algo así como Initialize (). Mueva el código de su evento Load a ese método. Inicialice Call () después de llamar al método Show (), las excepciones ahora son suyas para atrapar.

Tengo un formulario secundario que arroja una ApplicationException en el controlador de eventos Load (intencionalmente para fines de prueba). El formulario primario envuelve el método ChildForm.Show () en un bloque Try ... Catch ex ExException. El bloque catch simplemente muestra un mensaje y cierra el formulario secundario. Todo funciona como se esperaba cuando se depuró en visual studio 2008 (.net 3.5 sp1). Sin embargo, cuando lo ejecuto fuera de Visual Studio, parece que se pierde el bloque Catch y se produce una excepción no controlada. ¿Alguna idea de por qué es eso?

Gracias.

Código de ejemplo:

Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim f2 As Form2 f2 = New Form2 Try MessageBox.Show("Opening form 2") f2.ShowDialog() Catch ex As Exception f2.Close() MessageBox.Show("Form 2 closed.") End Try End Sub End Class Public Class Form2 Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Throw New ApplicationException("Test Form_Load") End Sub Public Sub New() '' This call is required by the Windows Form Designer. InitializeComponent() '' Add any initialization after the InitializeComponent() call. End Sub End Class

Stack Trace:

System.ApplicationException: Test Form_Load at WindowsApplication1.Form2.Form2_Load(Object sender, EventArgs e) in UnhandledExceptionTest2/WindowsApplication1/Form2.vb System.Windows.Forms.Form.OnLoad(EventArgs e) System.Windows.Forms.Form.OnCreateControl() System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) System.Windows.Forms.Control.CreateControl() System.Windows.Forms.Control.WmShowWindow(Message& m) at System.Windows.Forms.Control.WndProc(Message&> m) at System.Windows.Forms.ScrollableControl.WndProc(Message&> m) at System.Windows.Forms.ContainerControl.WndProc(Message&> m) at System.Windows.Forms.Form.WmShowWindow(Message&> m) at System.Windows.Forms.Form.WndProc(Message&> m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&> m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&> m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


La nueva ventana tiene su propio hilo, que está haciendo su propia carga. Para verificar esto, puede intentar colocar un Thread.Sleep durante unos segundos en Form2_Load antes de la excepción. La ventana principal de subprocesos debe continuar la ejecución antes de llegar a la excepción.


Me disculpo por el C # (no conozco la sintaxis de Vb)

estás haciendo algo como esto?

ChildForm child = new ChildForm(); try { child.Show(); } catch(Exception ex) {.....}

Si es así, creo que el evento Load ocurriría en el Nuevo, no en el Show (); (Mostrar dispararía Activar)


Tengo el mismo problema. Lo que eventualmente hice fue atrapar todas las excepciones. Cª#:

Application.ThreadException += new ThreadExceptionEventHandler(MyHandler);

Y luego muestra el formulario.

Me encantaría saber si alguien tiene una mejor solución.