Postupy: Definování a instalace globální obslužné rutiny výjimek
Následující příklad kódu ukazuje, jak je možné zachytit neošetřené výjimky. Ukázkový formulář obsahuje tlačítko, které při stisknutí provede odkaz null, což způsobí vyvolání výjimky. Tato funkce představuje typické selhání kódu. Výsledná výjimka je zachycena obslužnou rutinou výjimky pro celou aplikaci nainstalovanou hlavní funkcí.
Toho se dosahuje vazbou delegáta ThreadException na událost. V tomto případě se do metody odešlou App::OnUnhandled
další výjimky.
Příklad
// 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);
}