[C API] Exception werfen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

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:)
Grüßle.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Das komische ist aber, dass das try&except aus der Pythondatei heraus nicht greift, außerdem wird auch kein Traceback erstellt :/

~ Chris
Grüßle.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Solche vagen "das funktioniert nicht"-Aussagen bringen uns hier nicht weiter. Um dir helfen zu können, brauchen wir den Code.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

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
Grüßle.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

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
Grüßle.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

OMFG!
Danke, dass funktioniert.

~ Chris
Grüßle.
Antworten