पर निर्यात किए गए फ़ंक्शन में फेंकने वाले सी ++ अपवाद को संभालना मैं उपयोगकर्ता के कार्यक्षमता तक पहुंचने के लिए वैकल्पिक तरीके के रूप में अपने एप्लिकेशन में क्यूटी स्क्रिप्ट इंजन का उपयोग कर रहा हूं। इस प्रकार, मैं कुछ सी ++ कक्षाओं को क्यूटी स्क्रिप्टइंजिन में निर्यात करता हूं, जो एप्लिकेशन के इंटरफ़ेस के रूप में कार्य करेगा। समस्या यह है कि, इन सी ++ कक्षाएं अपवाद फेंक सकती हैं।क्यूटीस्क्रिप्ट
मेरे पास स्क्रिप्ट को संसाधित करने के अनुरोधों को सुनकर, "स्क्रिप्टइंटरफेस" वर्ग अपने धागे पर चल रहा है। इसलिए जब मैं किसी उपयोगकर्ता की स्क्रिप्ट का मूल्यांकन करता हूं, तो अपवादों को संभालने के लिए मेरे पास एक कोशिश/पकड़ ब्लॉक होता है, और एप्लिकेशन में कंसोल में त्रुटि प्रिंट करता है।
...
try {
m_engine->evaluate(script, name);
}
catch (Exception const& e) {
// deal with it
}
catch (...) {
// scary message
}
यह विंडोज़ में पूरी तरह से काम करता है ... लेकिन कार्यक्रम Linux- में काम नहीं करता इस संदेश के साथ समाप्त हो जाता है:
terminate called after throwing an instance of 'Basilisk::InvalidArgumentException'
what(): N8Basilisk24InvalidArgumentExceptionE
Aborted
मैं एक कूबड़ है कि यह था, क्योंकि अपवादों के बुलबुले था इवेंट हैंडलर (चूंकि स्क्रिप्ट इंजन मेरे निर्यातित वर्गों में कार्यों को कॉल करने के लिए सिग्नल का उपयोग करता है), इसलिए मैंने अपवादों को संभालने के लिए QApplication :: अधिसूचित किया, लेकिन उन्हें पकड़ा नहीं गया।
मेरा सवाल है, क्या मैं कुछ मौलिक रूप से गलत कर रहा हूं? साथ ही, एक विकल्प के रूप में, क्या मेरे सी ++ कक्षाओं के भीतर से स्क्रिप्ट अपवादों को स्पष्ट रूप से फेंकना संभव है?
अग्रिम
संपादित करें धन्यवाद: वर्णन पकड़ (...) बयान शामिल करने के लिए तय की।
अद्यतन (समाधान): मैंने स्वीकार किए गए उत्तर में उल्लिखित एक रणनीति के अनुसार इस समस्या को "तय" किया। यद्यपि मैं इस स्रोत पर नहीं गया हूं कि अपवादों को लिनक्स पर क्यों नहीं पकड़ा गया है (अब मेरा संदेह है, यह है कि m_engine-> लिनक्स पर एक अलग थ्रेड का मूल्यांकन करें), लेकिन मैंने इरादा का उपयोग करना शुरू कर दिया है क्यूटी लिपियों में अपवाद फेंकना, और यह QScriptContext::throwError()
है।
मामलों में जहां मेरी समारोह इस प्रकार दिखाई देगा में: (यादृच्छिक उदाहरण)
void SomeClass::doStuff(unsigned int argument) {
if (argument != 42) {
throw InvalidArgumentException(
"Not the answer to Life, the Universe and Everything.");
}
// function that is not part of the scripting environment,
// and can throw a C++ exception
dangerousFunction(argument);
}
अब यह यह है: (वापसी प्रकार पर विशेष ध्यान दें)
QScriptValue SomeClass::doStuff(unsigned int argument) {
if (argument != 42) {
// assuming m_engine points to an instance of
// QScriptEngine that will be calling this function
return m_engine->currentContext()->throwError(QScriptContext::SyntaxError,
"Not the answer to Life, the Universe and Everything.");
}
try {
// function that is not part of the scripting environment,
// and can throw a C++ exception
dangerousFunction(argument);
} catch (ExpectedException const& e) {
return m_engine->currentContext()->throwError(QScriptContext::UnknownError,
e.message());
}
// if no errors returned, return an invalid QScriptValue,
// equivalent to void
return QScriptValue();
}
तो जहां एक करता है इन स्क्रिप्ट त्रुटियों से निपटें? QScriptEngine::evaluate()
पर कॉल करने के बाद आप यह जांच सकते हैं कि QScriptEngine::hasUncaughtException()
के साथ कोई अपरिचित अपवाद नहीं है, uncaughtException()
के साथ त्रुटि ऑब्जेक्ट प्राप्त करें, और अब आपके पास स्क्रिप्ट में संदेश, ट्रेस और लाइन नंबर है जहां त्रुटि हुई!
उम्मीद है कि यह किसी की मदद करेगा!
वहाँ किसी भी है [अपवाद विनिर्देशों] के साथ कार्य करें (http://www.gotw.ca/publications/mill22.htm) शामिल है? –
मेरी कक्षाओं में कहीं भी नहीं –
क्या पकड़ है (...) {} 'उस अपवाद को पकड़ें? – tibur