Compartir vía


Cómo: Definir e instalar un controlador de excepciones global

En el ejemplo de código siguiente se muestra cómo se pueden capturar excepciones no controladas. El formulario de ejemplo contiene un botón que, cuando se presiona, realiza una referencia nula, lo que provoca que se produzca una excepción. Esta funcionalidad representa un error de código típico. La excepción resultante se detecta mediante el controlador de excepciones para toda la aplicación instalado por la función principal.

Esto se logra enlazando un delegado al evento ThreadException. En este caso, las excepciones posteriores se envían al método App::OnUnhandled.

Ejemplo

// global_exception_handler.cpp
// compile with: /clr
#using <system.dll>
#using <system.drawing.dll>
#using <system.windows.forms.dll>

using namespace System;
using namespace System::Threading;
using namespace System::Drawing;
using namespace System::Windows::Forms;

ref class MyForm : public Form
{
   Button^ b;
public:
   MyForm( )
   {
      b = gcnew Button( );
      b->Text = "Do Null Access";
      b->Size = Drawing::Size(150, 30);
      b->Click += gcnew EventHandler(this, &MyForm::OnClick);
      Controls->Add(b);
   }
   void OnClick(Object^ sender, EventArgs^ args)
   {
      // do something illegal, like call through a null pointer...
      Object^ o = nullptr;
      o->ToString( );
   }
};

ref class App
{
public:
   static void OnUnhandled(Object^ sender, ThreadExceptionEventArgs^ e)
   {
      MessageBox::Show(e->Exception->Message, "Global Exeception");
      Application::ExitThread( );
   }
};

int main()
{
   Application::ThreadException += gcnew
      ThreadExceptionEventHandler(App::OnUnhandled);

   MyForm^ form = gcnew MyForm( );
   Application::Run(form);
}

Vea también

Control de excepciones