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