방법: 전역 예외 처리기 정의 및 설치
다음 코드 예제에서는 처리되지 않은 예외를 캡처하는 방법을 보여 줍니다. 예제 폼에는 누를 때 null 참조를 수행하여 예외가 throw되는 단추가 포함되어 있습니다. 이 기능은 일반적인 코드 오류를 나타냅니다. 결과 예외는 주 함수에 의해 설치된 애플리케이션 전체 예외 처리기에 의해 catch됩니다.
이 작업은 이벤트에 대리자를 바인딩하여 수행됩니다 ThreadException . 이 경우 후속 예외가 메서드로 App::OnUnhandled
전송됩니다.
예시
// 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);
}