2009-10-17 10 views
40

En una aplicación de Windows Forms, en el evento Load de un formulario, agregue la siguiente línea:fallos silenciosos en C#, aparentemente excepciones no controladas que no se cuelga el programa

throw new Exception(); 

y ejecutar la aplicación. Corrió sin problemas. Esto se llama falla silenciosa, puede intentar agregar cuadros de mensaje antes y después, y pronto descubrirá que en lugar de bloquear la aplicación, la instrucción throw simplemente sale del evento Load.

Estoy seguro de que no hay necesidad de explicar qué tan feo y peligroso es esto.

Me preguntaba, sin embargo, en las razones (probablemente históricas) detrás de este comportamiento aterrador. Estoy seguro de que no es una decisión de diseño, probablemente sin opción, o flojera. ¿Alguien sabe?

Estaría contento si alguien me puede indicar una lista de eventos que también pueden causar fallas graves.

He aquí un fragmento de mi código - No tengo ni idea de lo que podría ayudar - pero, aquí está:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Form f = new Form(); 
      f.Load += new EventHandler((x, y) => { throw new Exception(); }); 
      Application.Run(f); 
     } 

    } 
} 

EDITAR Parece que no sucedió a todo el mundo. Uso: fw 3.5, winforms, vs 2008, vista x64, nuevo proyecto limpio de winforms, con el código mencionado anteriormente.

+1

¿Puede explicar mejor su problema con un fragmento de su controlador de eventos OnLoad para su formulario. Además, ¿tiene un controlador UnhandledException dentro de este dominio de aplicación? Si esta es la forma principal de la aplicación y no se puede cargar porque arrojó una excepción no controlada, ¿qué esperaba que sucediera? Sospecho que se invocará el controlador de eventos no controlados en este caso. –

+0

¿Qué versión de windows estás usando? –

+3

En realidad volví a votar su pregunta anterior, está mal escrita Y arrogante ... – Blindy

Respuesta

46

Esta es una known problem on x64 systems:

Este es un problema conocido en OS plataforma de 64 bits . La razón es que el núcleo del sistema operativo de 64 bits no permite la excepción en modo de usuario a través de pilas de modo Kernal. La excepción es tragada por OS sliently. Eso ocurre en el controlador FormLoad , porque se llama en una devolución de llamada a OS . El sistema operativo de 32 bits no hace esto, , por lo que no se reproduce allí.

El equipo del sistema operativo está investigando problemas relacionados . Mientras tanto, tiene para solucionar este problema. Al activar "Detener con excepción de primera oportunidad", se detiene el depurador en este escenario . Pero hace que el depurador se pare muy a menudo, por lo que podría querer hacer esto solo cuando encuentre un problema.

El informe de error vinculado se actualizó por última vez en febrero de 2008, y no indica lo que ha sucedido desde entonces.

Aquí puedo reproducir el comportamiento de la mayoría de los carteles en mi sistema de 32 bits, y puedo reproducir el comportamiento del OP en mi PC de trabajo de 64 bits (Vista SP2, 3.5SP1 Framework).

+0

muchas gracias ... medio recuerdo que me pasó a mí también con x86, pero no estoy seguro ... lo verificaré. – Letterman

+1

Curiosamente, esta excepción no se traga en mi máquina con Windows 7 x64 cuando la ejecuto sin depuración, pero se la trago cuando lo hago. – FacticiusVir

+1

@FacticiusVir: exactamente lo mismo aquí. En mi Win7 x64 solo se traga cuando estoy en el modo de depuración VS. – ulrichb

Cuestiones relacionadas