Xsubpp .xs फ़ाइलों से परिवर्तित c/c++ फ़ाइलों के लिए अपवाद हैंडलिंग कोड उत्पन्न कर सकता है। यह मेरे लिए निम्नलिखित कोड उत्पन्न करता है

TRY {
    char *  CLASS = (char *)SvPV_nolen(ST(0));
    Example *   RETVAL;

    RETVAL = new Example();
    ST(0) = sv_newmortal();
    sv_setref_pv( ST(0), CLASS, (void*)RETVAL );

}
BEGHANDLERS
CATCHALL
    sprintf(errbuf, "%s: %s\tpropagated", Xname, Xreason);
ENDHANDLERS

लेकिन जेनरेट कोड को संकलित करते समय, मुझे संकलन त्रुटियां मिल रही हैं क्योंकि TRY, BEGHANDLERS, CATCHALL, ENDHANDLERS को पर्ल हेडर फ़ाइलों में कहीं भी परिभाषित नहीं किया गया था। मैंने उपर्युक्त टोकन को इस तरह परिभाषित करने के लिए अपना कोड संशोधित किया है।

#define TRY try
#define BEGHANDLERS
#define CATCHALL catch (...) {
#define ENDHANDLERS }

लेकिन मैं Xname और Xreason को सार्थक परिभाषा नहीं दे पा रहा हूँ। क्या उपरोक्त परिभाषाएं सही हैं? हम ऊपर बताए गए कीवर्ड को कैसे हैंडल करते हैं

1
Surya 23 जून 2011, 14:49
क्या आपने जाँच की है कि क्या वे #define टोकन कार्यान्वयन कोड के लिए दृश्यमान हैं?
 – 
iammilind
23 जून 2011, 14:55

3 जवाब

सबसे बढ़िया उत्तर

यह "फिर ऐसा न करें" श्रेणी में आता है। ("डॉक्टर, जब मैं एक्स करता हूं तो दर्द होता है" का विहित उत्तर)। जेनरेट कोड देखें:

CATCHALL
    sprintf(errbuf, "%s: %s\tpropagated", Xname, Xreason);
ENDHANDLERS

यह अपवाद का प्रचार नहीं कर रहा है। यह एक संदेश प्रिंट कर रहा है और फिर इस तथ्य को पूरी तरह से अनदेखा कर रहा है कि एक त्रुटि हुई!

सी ++ के लिए पर्ल का समर्थन बल्कि कमजोर है। यह आश्चर्यजनक नहीं होना चाहिए; पर्ल सी में लिखा गया था और सी को इसके बाहरी सबरूटीन्स के लिए लक्षित करता है।

मेरा सुझाव: अपवादों को संभालें, लेकिन xsubpp से 'मुफ़्त' के लिए प्रदान की गई अजीब अपवाद सामग्री का उपयोग न करें। इसके बजाय try ... catch ... खुद को ब्लॉक करें। catch ब्लॉक को पकड़े गए C++ अपवादों को perl अपवादों में कनवर्ट करें। घातक त्रुटियों के लिए Perl_croak, गैर-घातक त्रुटियों के लिए Perl_warn पर कॉल करें।

और शुभकामनाएं। पर्ल को सी/सी++ में इंटरफेस करना आसान नहीं है।

कुछ संभावित सहायक लिंक:

2
Community 23 मई 2017, 15:04
सुझाव और लिंक के लिए धन्यवाद। अब लगभग कुछ हफ़्ते हो गए हैं, मैं केवल एक न्यूनतम वर्ग के लिए एक्सटेंशन लिखने में सक्षम हूँ।
 – 
Surya
24 जून 2011, 13:25

मैं xsubpp (या उस मामले के लिए पर्ल) के बारे में कुछ नहीं जानता, लेकिन अगर फेंके गए अपवाद को std::exception से प्राप्त करने के लिए माना जा सकता है, तो आप ऐसा कुछ कर सकते हैं:

#define CATCHALL catch(const std::exception& ex) {

तब Xreason को ex.what() में मैप किया जा सकता था। Xname अधिक कठिन है। आप इसे typeid(ex).name() जैसा कुछ बना सकते हैं, जो कुछ नहीं से बेहतर हो सकता है।

यह सबसे अच्छा समाधान है जिसके बारे में मैं सोच सकता हूं, जब तक कि कुछ xsubpp- विशिष्ट चाल न हो।

0
jalf 23 जून 2011, 15:03

ऐसा लगता है कि यह जानकारी को भाषा-अज्ञेय तरीके से इकट्ठा कर रहा है, फिर इसे पर्ल में प्रचारित कर रहा है। आपके द्वारा दिखाया गया कोड संदेश उत्पन्न कर रहा है, उसके बाद इसे प्रचारित करने के लिए कोड उत्पन्न करना चाहिए:

ENDHANDLERS
if (errbuf[0])
Perl_croak(aTHX_ errbuf);

तो आपको बस जो कुछ भी आपको लगता है उसे चुनने की ज़रूरत है जो इसे डीबग करने का प्रयास करने वाले किसी व्यक्ति के लिए उपयोगी होगा। मुझे लगता है कि संदेश में शामिल है कि अपवाद सी ++ से आया है उपयोगी होगा; और जैसा कि पिछले उत्तर में कहा गया है, e.what() से विवरण शामिल करें। तो कुछ इस तरह से काम करना चाहिए:

#include <stdexcept>

#define TRY try
#define BEGHANDLERS catch(std::exception const &e){
#define CATCHALL const char * Xreason = e.what();
#define ENDHANDLERS }

const char * Xname = "C++ exception";
0
Steve Sanbeg 21 मई 2013, 23:28