2008-08-12 14 views
6

/clr ile derlenen bir MFC uygulamasına sahibim ve aksi halde yakalanmamış yönetilen özel durumlar için bir son işleyiciyi uygulamaya çalışıyorum. Yerel istisnalar için CWinApp::ProcessWndProcException'u geçersiz kılar.Karma yerel/yönetilebilir yürütülebilir dosyadaki son yönetilen özel durum işleyici?

Jeff'in CodeProject article, Application.ThreadException ve AppDomain.CurrentDomain.UnhandledException numaralı önerilerinde önerilen iki olay yükseltilmez.

Herkes, karma bir yürütülebilir dosya için son yönetilen bir özel durum işleyici sunmanın bir yolunu önerebilir mi?


Güncelleme: İsterseniz

Bu durum işleyicileri sadece aşağı olarak tetiklendiğini anlaşılmaktadır Application.Run veya benzeri (. Bir çalışan iş parçacığı lezzet var, adını hatırlayamıyorum) gerçekten küresel yakalamak için yönetilen istisna bir SEH filtresi yüklemeniz gerekir. System.Exception'u almayacaksınız ve eğer bir arama bekletmesi yapmak istiyorsanız, kendi yürüteçlerinizi yuvarlamanız gerekecek.

Bu konuyla ilgili bir MSDN forumu sorusunda, bir try ... catch (Exception^) numaralı ana MFC iş parçacığının yeterince düşük düzeyli bir noktasını geçersiz kılması önerildi. Örneğin, CWinApp::Run. Bu iyi bir çözüm olabilir, ancak herhangi bir perf veya stabilite sonucuna bakmadım. Kefalet etmeden önce bir çağrı yığını ile oturum açma şansınız olacak ve varsayılan pencereleri izinsiz istisna davranışından kaçınabilirsiniz.

+0

Belki de bahsettiğiniz iki etkinlik tarafından yakalanmayan istisnalar hakkında daha fazla bilgi edinmemize yardımcı olabiliriz. – Charlie

+0

Hiç yönetilen bir istisna - Sistem :: Özel Durumun herhangi bir mirasçısı. Yukarıdaki olayların amacı, herhangi bir/yönetilen istisna yapılmadığı zaman ateş etmektir. –

cevap

0

Bu iki özel durum işleyicisini kullanmanız gerekir. Eğer dedikleri olacak ve düzgün ayarlanmış olduğunuz bir yerde ekledik emin (yani, başvurunuz en giriş noktası yönetilen içinde - Doğru, bir koydu?)

+0

Sanırım sorun hiçbir yerde Application.Run olmaması. –

1

Bu iki istisna işleyicisini kullanmanız gerekir.

Neden "ki?"

olaylar aşağıda kullanılarak yükseltilmiş değildir:, size yönetilmeyen istisnalar giderken filtreleri geçen almak için bir filtre yüklemek için gereken bulacaksınız

extern "C" void wWinMainCRTStartup(); 

// managed entry point 
[System::STAThread] 
int managedEntry(void) 
{ 
    FinalExceptionHandler^ handler = gcnew FinalExceptionHandler(); 

    Application::ThreadException += gcnew System::Threading::ThreadExceptionEventHandler(
             handler, 
             &FinalExceptionHandler::OnThreadException); 

    AppDomain::CurrentDomain->UnhandledException += gcnew UnhandledExceptionEventHandler(
                 handler, 
                 &FinalExceptionHandler::OnAppDomainException); 

    wWinMainCRTStartup(); 

    return 0; 
} 

// final thread exception handler implementation 
void FinalExceptionHandler::OnThreadException(Object^ /* sender */, System::Threading::ThreadExceptionEventArgs^ t) 
{ 
    LogWrapper::log->Error("Unhandled managed thread exception.", t->Exception); 
} 

// final appdomain exception handler implementation 
void FinalExceptionHandler::OnAppDomainException(System::Object ^, UnhandledExceptionEventArgs ^args) 
{ 
    LogWrapper::log->Error("Unhandled managed appdomain exception.", (Exception^)(args->ExceptionObject)); 
} 

BOOL CMyApp::InitInstance() 
{ 
    throw gcnew Exception("test unhandled"); 
    return TRUE; 
} 
İlgili konular