.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.