2010-12-17 15 views
12

मानक सी ++ std::exception::what() एक संकीर्ण चरित्र स्ट्रिंग देता है। इसलिए, अगर मैं वहां एक विस्तृत चरित्र स्ट्रिंग संदेश रखना चाहता हूं, तो मैं नहीं कर सकता।क्या अपवादों में विस्तृत चरित्र तारों को संभालने के लिए एक विशिष्ट पैटर्न है?

क्या इसके आसपास होने के लिए एक आम तरीका/पैटर्न/लाइब्रेरी है?

संपादित करें: स्पष्ट होने के लिए, मैं बस अपना अपवाद वर्ग लिख सकता हूं और इससे प्राप्त कर सकता हूं - लेकिन अगर मैं मानक कार्यान्वयन करता हूं तो मैं उत्सुक हूं। boost::exception जो मैं सोच रहा था उनमें से अधिकांश ऐसा लगता है ....

+0

मैं यूटीएफ 8 के रूप में स्ट्रिंग को फिर से एन्कोड करने का सुझाव देने जा रहा था लेकिन जिस स्थिति में इसका उपयोग किया जाएगा, मुझे खुशी है कि मैंने नहीं किया! – dreamlax

+0

अगर आपको पता चल जाए तो मुझे बताएं। मैं भी ऐसी ही समस्या का सामना कर रहा हूँ। एक सिद्धांत में अपवादों के लिए एक नया आधार वर्ग बना सकता है, लेकिन इससे सभी आकर्षक अंत वास्तव में गन्दा हो जाते हैं। शायद एक नया वर्ग अपवाद: सार्वजनिक std :: अपवाद, और अंदर जादू करो, लेकिन मुझे डर है कि यह बहुत अक्षम हो सकता है। –

+0

संभवतः संबंधित: (http://stackoverflow.com/questions/3760731) –

उत्तर

5

इस पोस्ट Exceptions with Unicode what() के आधार पर, मैं इस तरह से कुछ करने का फैसला किया। यूटीएफ -8 से TCHAR से मेरा रूपांतरण दिनचर्या अपरिचित यूटीएफ -8 अनुक्रमों को छोड़ देगा, और उन्हें प्रतिस्थापित करेगा? इस तरह, यदि .what() ऐसा कुछ देता है जो वैध यूटीएफ -8 मान्य नहीं है, तो यह महाकाव्य विफल नहीं होगा।

कोड संकलित नहीं किया गया है (बाद में आज - कुछ अन्य चीजों को ठीक करना है! :)। मैं वहां एमएफसी-इस्म्स के लिए भी माफी माँगता हूं, लेकिन मुझे लगता है कि संदेश वैसे भी हो जाता है।

+0

मैं एक चरित्र के अलावा अन्य का उपयोग करता हूं? - इस तरह से भारी सुरक्षा भेद्यता मज़ा की ओर जाता है। लेकिन एक उपयोगी उत्तर के लिए +1। –

+0

आपको बस इतना करना है कि यह बिल्कुल सही, U + FFFD, [यूनिकोड प्रतिस्थापन चरित्र] (http://www.unicode.org/charts/PDF/UFFF0.pdf) का उपयोग करें (एक सफेद? एक काले हीरे में) चाहते हैं जो "एक आने वाले चरित्र को प्रतिस्थापित करने के लिए प्रयोग किया जाता है जिसका मूल्य यूनिकोड में अज्ञात या अप्रत्याशित है।" –

+0

असल में मैं प्रतिस्थापन चरित्र का उपयोग कर रहा हूं। (बस इसे चेक किया गया :) –

2

ठीक है, क्यूटी में आपको तारों के लिए क्यूस्ट्रिंग मिलती है, और यह स्ट्रिंग हमेशा यूनिकोड में होती है। ऐसा नहीं है कि तुम सिर्फ अपवाद की खातिर क्यूटी के लिए जाना चाहिए, लेकिन अभी भी :)

+0

......... उपयोगी –

+0

ठीक है, बिली एक पुस्तकालय के लिए पूछना था :) – Septagram

+0

खैर [यूनिकोड क्या() के साथ अपवाद], मैं 'std :: wstring' का उपयोग कर रहा हूं ... मेरे पास पहले से यूनिकोड में एक स्ट्रिंग है। अपवादों के साथ क्या करना है? –

3

तुम कुछ भी वहाँ रख सकते हैं, लेकिन अगर तीसरे पक्ष के कोड what() से एक const char* उम्मीद है, आप इसे से const char* लौटना चाहिए।

अपने कोड के लिए - बस std::exception से प्राप्त करें और const wchar_t* wwhat() विधि जोड़ें।

class uexception : public std::exception { 
public: 
    uexception(LPCTSTR lpszMessage) 
     : std::exception(TCharToUtf8(lpszMessage)) { } 
}; 
मेरी कोड बेस में

हर जगह है, मैं यह सोचते हैं कि .what() एक स्ट्रिंग है UTF-8 में एन्कोड किया गया है वापस आ जाएगी:

+0

कभी-कभी सरल उत्तर बहुत अच्छे होते हैं :) –

संबंधित मुद्दे