2012-09-25 28 views
6

यदि कोई Windows रनटाइम प्रकार COM त्रुटि उठाता है .NET लगता है कि यह त्रुटि अक्सर (या हमेशा?) को Exception उदाहरण में लपेटती है। त्रुटि संदेश में COM HRESULT त्रुटि कोड शामिल है। नई क्रिप्टोग्राफिक संदेश के साथ एक Exception में एक गलत बफर लंबाई परिणाम उदाहरण के लिए एईएस सीबीसी के साथ API का उपयोग करने "की आपूर्ति की उपयोगकर्ता बफर अनुरोध किया गया कार्य के लिए मान्य नहीं है। (Exception from HRESULT: 0x800706F8)"।WinRT अपवादों को कैसे संभालें जिससे अपवाद होता है?

ठीक है, हम कैसे उन अपवादों को संभालने के लिए चाहिए? क्या हमें अपवाद से HRESULT कोड पढ़ना चाहिए ताकि यह पता चल सके कि किस प्रकार का अपवाद था? क्लासिक .NET में मुझे CryptographicException मिलेगा जो कि मैं अन्य त्रुटियों से क्रिप्टोग्राफिक त्रुटियों को अलग करने के लिए उपयोग कर सकता हूं।

एक और बात यह है कि मुझे समझ नहीं आता माइक्रोसॉफ्ट कोड गुणवत्ता नियम कहते हैं कि यह है कि एक होना चाहिए है कभी नहीं फेंक अपवाद लेकिन हमेशा व्युत्पन्न प्रकार के। इसका कारण यह है कि किसी को भी सामान्य Exception को पकड़ने के लिए मजबूर होना चाहिए जो OutOfMemoryException जैसे अधिक घातक अपवादों को पकड़ता है। एक और नियम कहता है कि किसी को पुस्तकालयों में कभी भी Exceptio एन पकड़ना नहीं चाहिए। अगर हम विंडोज स्टोर ऐप या विनआरटी पुस्तकालयों में Exception पकड़ने के लिए मजबूर हैं तो हम इन नीतियों का पालन कैसे कर सकते हैं?

वैसे: Clemens Vasters shows in his blog how we can catch Exception while avoiding to catch fatal exception। मुझे लगता है कि Exception पकड़ना अब खराब कोड नहीं है।

+0

जुड़ा हुआ ब्लॉग प्रविष्टि के संबंध में, सूचीबद्ध "घातक" अपवाद के कई प्रबंधित कोड द्वारा पकड़ा नहीं जा सकता है। विशेष रूप से, 'स्टैक ओवरफ्लो एक्सेप्शन', हालांकि मैं काफी हद तक निश्चित हूं कि एवी को या तो पकड़ा नहीं जा सकता है (दोनों को देशी कोड में पकड़ा जा सकता है, लेकिन ऐसा करना खतरनाक है)। ध्यान दें कि कुछ अपवाद जो _appear_ घातक वास्तव में ऐसा नहीं हो सकता है। उदाहरण के लिए, कई COM घटक 'E_OUTOFMEMORY' लौटाते हैं जब किसी विशेष बफर में स्थान समाप्त हो जाती है। इस HRESULT को आउटऑफमेमरी अपवाद के रूप में अनुवादित किया जाएगा, लेकिन इसका मतलब यह नहीं है कि प्रक्रिया ने अपनी संपूर्ण पता स्थान समाप्त कर दी है। –

उत्तर

4

Exception पकड़ना संभव है, HRESULT पर स्विच करके विशेष त्रुटियों को संभालना, और Exception को फिर से फेंकना अगर त्रुटि "अप्रत्याशित" थी। उदाहरण के लिए,

try 
{ 
    // ... 
} 
catch (Exception ex) 
{ 
    switch (ex->HResult) 
    { 
    case E_INVALID_USER_BUFFER: // 0x800706f8 
     // handle invalid buffer case... 
     break; 
    default: 
     // Unexpected exception; re-throw: 
     throw; 
    } 
} 

वैकल्पिक रूप से, (मैं ध्यान दें होता है कि गलत बफर प्रदान अधिक एक रनटाइम त्रुटि की तुलना में एक तर्क त्रुटि की तरह लगता है, तो मुझे आश्चर्य है कि इस विशेष अपवाद वास्तव में पकड़ा जाना चाहिए।)

एक अधिक सामान्य समाधान एक समारोह या कार्यों का सेट लिखना होगा जो ज्ञात HRESULTs के लिए Exception को संभालते हैं और एक और विशिष्ट अपवाद को फिर से फेंक देते हैं। उदाहरण के लिए,

static void HandleKnownExceptions(Action f) 
{ 
    try 
    { 
     f(); 
    } 
    catch (Exception ex) 
    { 
     // Detect expected HRESULTs and throw the more-specific exception 
     // type for each. 
    } 
} 

इनमें से दोनों दृष्टिकोण सी ++ और सी # दोनों में समान रूप से अच्छी तरह से काम करते हैं।

ध्यान दें कि यह जरूरी मामला है कि Exception मंच या अन्य घटकों द्वारा सीधे फेंक दिया जाता है नहीं है। विंडोज रनटाइम एबीआई परत पर, कोई अपवाद नहीं है: एआरआई सीमा में HRESULT द्वारा सभी त्रुटियों की सूचना दी गई है। सीएलआर कुछ विशिष्ट अपवाद प्रकारों के लिए कुछ हद तक ज्ञात HRESULT का अनुवाद करता है, लेकिन यह सामान्य अनुवाद नहीं कर सकता है।

+0

धन्यवाद जेम्स। अमान्य बफर HRESULT को पकड़ते समय यह मेरा दृष्टिकोण था। मुझे यह थोड़ा अजीब लगता है कि .NET प्रोग्रामर को अब HRESULTS से निपटना होगा। अमान्य डेटा को डिक्रिप्ट करने का प्रयास करते समय आपको आसानी से अमान्य बफर मिलता है जो कि टेम्पर्ड हो या बस फसल हो सकता है। मुझे लगता है कि सही लंबाई के लिए एन्क्रिप्टेड डेटा की जांच करना लगभग असंभव है क्योंकि यह प्रयुक्त एल्गोरिदम और कुंजी पर निर्भर करता है। उपयोग किए गए ब्लॉक आकार को खोजने के लिए पहले से ही काफी मुश्किल है।अमान्य बफर त्रुटि को पकड़ना यह सुनिश्चित करने के लिए महत्वपूर्ण है कि उपयोगकर्ता के अनुकूल तरीके से अमान्य डेटा का इलाज किया जाए। –

+0

आह, मेरी गलती तब। मुझे गलत समझा गया कि बफर क्या अमान्य था। आप सही हैं, इस प्रकार की त्रुटि को संभालना एक अच्छा विचार है :-) –