2008-08-12 21 views
6

मेरे पास एक एमएफसी एप्लीकेशन/क्लियर के साथ संकलित है और मैं अन्यथा अनचाहे प्रबंधित अपवादों के लिए अंतिम हैंडलर को कार्यान्वित करने की कोशिश कर रहा हूं। देशी अपवादों के लिए, ओवरराइडिंग CWinApp::ProcessWndProcException काम करता है।मिश्रित देशी/प्रबंधित निष्पादन योग्य में अंतिम प्रबंधित अपवाद हैंडलर?

जेफ के CodeProject article, Application.ThreadException और AppDomain.CurrentDomain.UnhandledException में सुझाए गए दो कार्यक्रमों को उठाया नहीं गया है।

कोई मिश्रित निष्पादन योग्य के लिए अंतिम प्रबंधित अपवाद हैंडलर प्रदान करने का कोई तरीका सुझा सकता है?


अद्यतन:

ऐसा लगता है कि इन अपवाद संचालकों केवल नीचे की ओर का ट्रिगर कर रहे हैं Application.Run या इसी तरह की (। वहाँ एक कार्यकर्ता धागा स्वाद है, नाम याद नहीं है) यदि आप चाहते हैं सही मायने में विश्व स्तर पर पकड़ने के लिए एक प्रबंधित अपवाद आपको एक एसईएच फ़िल्टर स्थापित करने की आवश्यकता है। आपको System.Exception नहीं मिल रहा है और यदि आप कॉलस्टैक चाहते हैं तो आपको अपना वॉकर रोल करना होगा।

इस विषय पर एक एमएसडीएन मंच प्रश्न में इसे try ... catch (Exception^) में मुख्य एमएफसी थ्रेड के पर्याप्त निम्न-स्तर बिंदु को ओवरराइड करने का सुझाव दिया गया था। उदाहरण के लिए, CWinApp::Run। यह एक अच्छा समाधान हो सकता है लेकिन मैंने किसी भी perf या स्थिरता प्रभाव को नहीं देखा है। आपको जमानत से पहले कॉल स्टैक से लॉग इन करने का मौका मिलेगा और आप डिफॉल्ट विंडोज़ अनचाहे अपवाद व्यवहार से बच सकते हैं।

+0

शायद यह उन अपवादों के बारे में अधिक जानने में हमारी सहायता करेगा जो आपके द्वारा उल्लिखित दो घटनाओं द्वारा पकड़े नहीं गए हैं? – Charlie

+0

किसी भी प्रबंधित अपवाद - सिस्टम :: अपवाद के किसी भी उत्तराधिकारी। उपर्युक्त घटनाओं का बिंदु आग लगाना है जब/कोई/प्रबंधित अपवाद बेकार है। –

उत्तर

2

इन्टरनेट चारों ओर एक नज़र ले रहा है, तो आप पाएंगे कि आप अप्रबंधित अपवाद के लिए अपने रास्ते पर फिल्टर गुजर पाने के लिए एक फिल्टर स्थापित करने की आवश्यकता आपका ऐपडोमेन CLR and Unhandled Exception Filters से:

सीएलआर अनचाहे अपवादों को पकड़ने के लिए एसईएच अनचाहे अपवाद फ़िल्टर तंत्र पर निर्भर करता है।

0

उन दो अपवाद हैंडलरों का उपयोग करना चाहिए। क्या आप वाकई इन्हें एक जगह है जहाँ वे के नाम से जाना जा रहे हैं और ठीक से सेट में जोड़ दिया है कर रहे हैं (यानी, में अपने एप्लिकेशन का प्रवेश बिंदु में कामयाब रहे - आप में से एक है, सही रखा है?)

+0

मुझे लगता है कि समस्या यह है कि कोई आवेदन नहीं है। कहीं भी चलाएं। –

1

उन दो अपवाद हैंडलर का उपयोग करना चाहिए।

क्यों "चाहिए?"

घटनाओं नीचे का उपयोग कर उठाया नहीं कर रहे हैं:

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; 
} 
संबंधित मुद्दे