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

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

जेफ के CodeProject आलेख , Application.ThreadException और <कोड> AppDomain.CurrentDomain.UnhandledException , उठाए नहीं गए हैं।

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


अद्यतन करें:

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

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

0
ro fr bn
किसी भी प्रबंधित अपवाद - सिस्टम :: अपवाद के किसी भी विरासतकर्ता। उपर्युक्त घटनाओं का बिंदु आग लगाना है जब/कोई/प्रबंधित अपवाद बेकार है।
जोड़ा लेखक Aidan Ryan, स्रोत
हो सकता है कि इससे हमें उन अपवादों के बारे में अधिक जानने में मदद मिलेगी जो फेंक रहे हैं जो आपके द्वारा उल्लिखित दो घटनाओं द्वारा पकड़े नहीं गए हैं?
जोड़ा लेखक Charlie, स्रोत

3 उत्तर

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

क्यों जरूरी है?"

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

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;
}
0
जोड़ा

इंटर्ननेट के चारों ओर एक नज़र डालने पर, आप पाएंगे कि आपको अपने ऐपडोमेन के रास्ते पर फ़िल्टर को पारित अप्रबंधित अपवाद प्राप्त करने के लिए फ़िल्टर इंस्टॉल करने की आवश्यकता है। सीएलआर से और अनचाहे अपवाद फ़िल्टर :

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

0
जोड़ा

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

0
जोड़ा
मुझे लगता है कि समस्या यह है कि कोई आवेदन नहीं है। कहीं भी चलाएं।
जोड़ा लेखक Aidan Ryan, स्रोत