मैं Boost.Python का उपयोग कर एक पायथन एक्सटेंशन मॉड्यूल को कार्यान्वित कर रहा हूं। मॉड्यूल को अपने स्वयं के कस्टम अपवाद वर्गों को परिभाषित करना चाहिए जो Exception
का उत्तराधिकारी है। मैं उसको कैसे करू?बूस्ट। पायथन कस्टम अपवाद वर्ग
उत्तर
निम्न फ़ंक्शन एक नया पायथन अपवाद वर्ग बनाता है और इसे वर्तमान दायरे में जोड़ता है। यदि इसे मॉड्यूल प्रारंभिक फ़ंक्शन में कहा जाता है, तो इसे मॉड्यूल में जोड़ा जाता है।
पहला तर्क नई अपवाद वर्ग का नाम है। दूसरा तर्क नई अपवाद वर्ग के आधार वर्ग के लिए प्रकार वस्तु है; यह Exception
के लिए प्रकार ऑब्जेक्ट पर डिफ़ॉल्ट है। वापसी मान नई अपवाद वर्ग के लिए प्रकार वस्तु है।
PyObject* createExceptionClass(const char* name, PyObject* baseTypeObj = PyExc_Exception)
{
using std::string;
namespace bp = boost::python;
string scopeName = bp::extract<string>(bp::scope().attr("__name__"));
string qualifiedName0 = scopeName + "." + name;
char* qualifiedName1 = const_cast<char*>(qualifiedName0.c_str());
PyObject* typeObj = PyErr_NewException(qualifiedName1, baseTypeObj, 0);
if(!typeObj) bp::throw_error_already_set();
bp::scope().attr(name) = bp::handle<>(bp::borrowed(typeObj));
return typeObj;
}
इस प्रकार समारोह का उपयोग करें:
कॉल मॉड्यूल आरंभीकरण समारोह में समारोह और एक वैश्विक चर में वापसी मान की दुकान: प्रकार MyModule.MyException
की
PyObject* myExceptionTypeObj = 0;
BOOST_PYTHON_MODULE(MyModule)
{
...
myExceptionTypeObj = createExceptionClass("MyException");
...
}
बढ़ाएं अपवाद:
PyErr_SetString(myExceptionTypeObj, "Oh my!")
कहें 'MyException' वास्तव में एक C++ प्रकार के लिए मानचित्र करता है। मैं अपने सदस्यों का पर्दाफाश कैसे करूं? – Barry
@ केनी:
यदि आप
PyErr_SetString(myExceptionTypeObj, "Oh my!")
का उल्लेख मैं "के रूप में एक वैश्विक वस्तु के लिए स्ट्रिंग को कॉपी" इस संबंध नहीं होता। इसके बजाय, यह पाइथन के आंतरिक त्रुटि संकेतक को सेट करता है ताकि दुभाषिया मेरी अगली त्रुटि सूचक जांच पर myExceptionTypeObj का एक उदाहरण उठाएगा।
पायथन का अपवाद हैंडलिंग वैश्विक त्रुटि संकेतक (प्रति पायथन थ्रेड) के साथ काम करता है और सी एपीआई afaict के माध्यम से अपवाद बढ़ाने का यह सामान्य तरीका है।
मेरा लेना यह है कि यदि आप इस समय जीआईएल धारण करते हैं तो आप सुरक्षित हैं और आपके सी कोड को पाइथन थ्रेड में अपवाद का उचित कारण बनेंगे।
अपनी त्रुटियों को 'अपवाद' से प्राप्त करें; 'मानक त्रुटि' का उपयोग पायथन मानक पुस्तकालय से उपकरण द्वारा उत्पन्न त्रुटियों द्वारा किया जाता है। – Daenyth
@ डेनथ: आप सही हैं। मैंने सवाल संशोधित कर दिया है। – user763305