Seite 1 von 1
[C API] Exception werfen
Verfasst: Donnerstag 6. August 2009, 18:39
von theliquidwave
Hi.
Ich versuche gerade eine Python Exception durch eine C Extension zu werfen.
Ich habe es folgendermaßen versucht:
Code: Alles auswählen
PyErr_WarnEx(PyExc_RuntimeWarning, "too many or too less arguments, "#expected" arguments excepted plus "#optional" optionals", 0);
Jedoch wirft das nur einen Error in der warnings.py.
PyErr_SetString funktioniert zwar (zeigt eine Nachricht an), wirft aber keine Exception, die man mit try&except in Python filtern kann.
http://docs.python.org/c-api/exceptions ... Err_WarnEx
Ich find darüber einfach nicht mehr o_O
Bin dankbar für jede Hilfe:)
Re: [C API] Exception werfen
Verfasst: Samstag 8. August 2009, 22:27
von birkenfeld
Chrisber hat geschrieben:
PyErr_SetString funktioniert zwar (zeigt eine Nachricht an), wirft aber keine Exception, die man mit try&except in Python filtern kann.
Dann machst du etwas falsch. PyErr_Set* ist genau das, was du benutzen musst. PyErr_Warn ist, wie der Name schon sagt, für Warnungen da.
Verfasst: Sonntag 9. August 2009, 02:05
von theliquidwave
Das komische ist aber, dass das try&except aus der Pythondatei heraus nicht greift, außerdem wird auch kein Traceback erstellt :/
~ Chris
Verfasst: Sonntag 9. August 2009, 08:08
von birkenfeld
Solche vagen "das funktioniert nicht"-Aussagen bringen uns hier nicht weiter. Um dir helfen zu können, brauchen wir den Code.
Verfasst: Sonntag 9. August 2009, 18:31
von theliquidwave
Hi.
Tut mir leid, aber was soll ich mehr als
Code: Alles auswählen
PyErr_SetString(PyExc_RuntimeError, "invalid handle passed into spawnPlayerByHandle");
posten?
~ Chris
Verfasst: Sonntag 9. August 2009, 18:49
von birkenfeld
Die ganze C-Funktion, und wie du sie aus Python aufrufst. Interessant ist z.B., was du nach dem PyErr_SetString() tust.
Am besten wäre natürlich ein reduzierter Testcase.
Verfasst: Sonntag 9. August 2009, 19:05
von theliquidwave
Hi.
Code: Alles auswählen
static PyObject *pySpawnPlayerByHandle(PyObject *self, PyObject *args)
{
PyObject *pyHandle = NULL;
if (PyArg_ParseTuple(args, "O", &pyHandle))
{
if (PyInt_Check(pyHandle))
{
// ...
}
else
{
PyErr_SetString(PyExc_RuntimeError, "invalid handle passed into spawnPlayerByHandle");
}
}
return Py_BuildValue("()");
}
~ Chris
Verfasst: Sonntag 9. August 2009, 19:08
von birkenfeld
Da haben wirs schon -- dein Fehlerhandling ist total kaputt.
Sowohl wenn deine Funktion eine Exception setzt, also auch wenn eine aufgerufene Funktion (wie PyArg_ParseTuple) eine Exception gesetzt hat (wie das im Rückgabewert angezeigt wird, sagt die Doku), muss deine Funktion (sofort) NULL zurückgeben.
Lies bitte
http://docs.python.org/c-api/intro.html#exceptions durch, da sollte das alles beschrieben sein.
Verfasst: Sonntag 9. August 2009, 20:20
von theliquidwave
OMFG!
Danke, dass funktioniert.
~ Chris