2011-06-20 18 views
8

मैं सी में एक पायथन मॉड्यूल लिख रहा हूं। मुझे उन त्रुटियों की रिपोर्ट करने की आवश्यकता है जिन्हें अंतर्निहित पायथन अपवादों द्वारा वर्णित नहीं किया जा सकता है। इसलिए मैं अपने स्वयं के प्रकार के अपवाद फेंकना चाहता हूं। समस्या यह है कि पाइथन नीति बेसएक्सप्शन कक्षा से सभी अपवादों को प्राप्त करना है। मुझे पता है कि व्युत्पन्न प्रकार वस्तु कैसे बनाएं (tp_base memeber को असाइन करना), लेकिन मुझे नहीं पता कि बेसएक्सप्शन प्रकार ऑब्जेक्ट का संदर्भ कैसे प्राप्त करें। PyExc_BaseException PyObject का संदर्भ है, एक वर्ग का प्रतिनिधित्व करता है, एक प्रकार वस्तु नहीं।सी एक्सटेंशन में कस्टम पायथन अपवाद प्रकार कैसे बनाएं?

मैं सी कोड से कस्टम पायथन अपवाद कैसे फेंक सकता हूं?

+2

ए (नई शैली) वर्ग और एक प्रकार की वस्तु पाइथन में एक ही चीज़ है, इसलिए मुझे आपकी समस्या नहीं आती है। –

+0

स्वेन, मैंने PyExc_RuntimeError डाला है और इसे अपने स्वयं के अपवाद के लिए आधार प्रकार के रूप में उपयोग किया है। अभी तक कुछ भी बुरा नहीं हुआ (मुझे विश्वास है कि लंबी दौड़ के बाद सेगफाल्ट कुछ और के कारण होते हैं)। क्या आप मेरे प्रश्न का उत्तर दे सकते हैं, इसलिए मैं आपका जवाब स्वीकार कर सकता हूं? – Basilevs

उत्तर

4

सी कोड में नया अपवाद प्रकार बनाने का सबसे आसान तरीका PyErr_NewException पर कॉल करना है।

+1

मैं परिणामस्वरूप वर्ग की वस्तुओं में सदस्यों को कैसे जोड़ूं? मैं excetion ऑब्जेक्ट में कहीं भी त्रुटि कोड स्टोर करना चाहता हूँ। – Basilevs

+0

@ बेसिलव्स: आप अपने अपवाद के लिए कन्स्ट्रक्टर तर्कों को पास कर सकते हैं ['PyErr_SetObject()'] (http://docs.python.org/c-api/exceptions.html#PyErr_SetObject)। 'बेसएक्सप्शन' का कन्स्ट्रक्टर बस 'args' विशेषता में तर्क tuple स्टोर करता है। यदि आप एक अलग व्यवहार चाहते हैं, तो कन्स्ट्रक्टर को ओवरराइट करें। –

+1

फिर पाइथन पक्ष इस मूल्य तक कैसे पहुंच सकता है? मैं पार्सिंग तर्क tuple पसंद है। मुझे जो चाहिए वह उठाए गए ऑब्जेक्ट में अतिरिक्त सदस्य फ़ंक्शन है। यदि PyErr_NewException के dict तर्क को अतिरिक्त फ़ंक्शंस स्टोर करना है, तो मैं पायथन पक्ष से एक नया सदस्य फ़ंक्शन कैसे बना सकता हूं? – Basilevs

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