2011-06-20 35 views
8

C dilinde bir Python modülü yazıyorum Yerleşik Python istisnaları tarafından tanımlanamayan hataları bildirmem gerekiyor. Bu yüzden kendi türlerimden istisnalar atmak istiyorum. Sorun, Python ilkesinin BaseException sınıfındaki tüm istisnaları türetmektir. Türetilmiş bir nesneyi nasıl oluşturacağımı biliyorum (tp_base belleğine atama), ancak BaseException türü nesnesine nasıl başvuru yapacağımı bilmiyorum. PyExc_BaseException, bir nesneyi değil, bir nesneyi temsil eden PyObject öğesine bir başvurudır.C uzantısında özel bir Python özel durum türü nasıl oluşturulur?

C kodundan özel Python özel durumlarını nasıl atabilirim?

+2

A (yeni stil) sınıfı ve bir yazım nesnesi Python'da aynı şeydir, bu yüzden sorununuzu anlamıyorum. –

+0

Sven, PyExc_RuntimeError'u kullandım ve kendi Özel Durumum için temel tür olarak kullandım. Şimdiye kadar kötü bir şey olmadı (uzun vadeden sonra segfaultların başka bir şeyden kaynaklandığına inanıyorum). Soruma cevap verir misin, cevabınızı kabul edebilir miyim? – Basilevs

cevap

4

C kodunda yeni bir özel durum türü oluşturmanın en kolay yolu, PyErr_NewException numaralı telefonu aramaktır.

+1

Sonuç sınıfının nesnelerine nasıl üye eklerim? Hata kodunu bir yere yerleştirmek istiyorum. – Basilevs

+0

@Basilevs: İstisnanız için yapıcı argümanlarını ['PyErr_SetObject()'] 'a aktarabilirsiniz (http://docs.python.org/c-api/exceptions.html#PyErr_SetObject). 'BaseException' kurucusu sadece argüman tuple 'args' özniteliğinde saklar. Farklı bir davranış istiyorsanız, kurucunun üzerine yazın. –

+1

Peki python tarafı bu değere nasıl erişebilir? Kolları ayırmaktan hoşlanırım. İhtiyacım olan şey, yükseltilmiş nesnede ekstra üye işlevidir. PyErr_NewException'ın dict argümanı fazladan fonksiyonları saklıyorsa, Python tarafından yeni üye fonksiyonlarını nasıl oluşturabilirim? – Basilevs

İlgili konular