Wie verwende ich die C-API und Ausnahmen von Python richtig?
wenn ich sowas mache
>>> x = int(1,2,3,4,5)
Ich erhalte sofort einen schwerwiegenden Fehler (einer, der die Programmausführung beenden würde, wenn er in einem vorab geschriebenen Skript enthalten wäre)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: int() takes at most 2 arguments (5 given)
undx
bleibt undefiniert:
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
Wie würde ich vorgehen, um das in Pythons C-API zu implementieren? Ich habe welche gefundenDokumentation dafür, aber ich bin nicht sicher, wie ich es richtig verwenden kann.
Folgendes habe ich versucht:
Drucken:
if(something) {
PyErr_SetString(PyExc_TypeError, "Oh no!");
PyErr_Print();
}
Dies gibt leider nur die Ausnahme aus und das Programm wird fortgesetzt. Außerdem - wenn ich es richtig verstehe -PyErr_Print()
Entfernt die Ausnahme aus einer Art Warteschlange, sodass Python denkt, dass sie behandelt wird. So sieht es aus:
>>> import awesomemod
>>> x = awesomemod.thing()
TypeError: Oh no!
>>> x # x is defined because the function returns None eventually
>>>
PyErr_Occurred()
:
if(something) {
PyErr_SetString(PyExc_TypeError, "Oh no!");
PyErr_Occurred();
}
Verhalten:
>>> import awesomemod
>>> awesomemod.thing()
>>>
TypeError: Oh no!
>>>
Also ist es schon spät ...
return PyErr_Occurred()
:
if(something) {
PyErr_SetString(PyExc_TypeError, "Oh no!");
return PyErr_Occurred();
}
Verhalten:
>>> import awesomemod
>>> awesomemod.thing()
<type 'exceptions.TypeError'>
>>>
TypeError: Oh no!
Dieser ist einfach wirklich komisch.
Was muss ich tun, um das Verhalten der integrierten Funktionen zu ermitteln?
Bearbeiten: Ich habe versucht, was @ user2864740 in einem Kommentar vorgeschlagen und es hat perfekt funktioniert!
if(something) {
PyErr_SetString(PyExc_TypeError, "Oh no!");
return (PyObject *) NULL;
}