Как правильно использовать Python C API и исключения?
если я сделаю что-то вроде
>>> x = int(1,2,3,4,5)
Я сразу же получаю фатальную ошибку (такую, которая прервала бы выполнение программы, если бы она была в заранее написанном скрипте)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: int() takes at most 2 arguments (5 given)
а такжеx
остается неопределенным:
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
Как мне реализовать это в C API Python? Я нашел некоторыедокументация за это, но я не уверен, что знаю, как правильно его использовать.
Вот что я пытался:
Распечатать:
if(something) {
PyErr_SetString(PyExc_TypeError, "Oh no!");
PyErr_Print();
}
Это, к сожалению, только печатает исключение, и программа продолжается. Кроме того, если я правильно понимаю,PyErr_Print()
удаляет исключение из какой-то очереди, поэтому Python считает, что оно обработано. Вот как это выглядит:
>>> 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();
}
Поведение:
>>> import awesomemod
>>> awesomemod.thing()
>>>
TypeError: Oh no!
>>>
Так что это вроде как поздно ...
return PyErr_Occurred()
:
if(something) {
PyErr_SetString(PyExc_TypeError, "Oh no!");
return PyErr_Occurred();
}
Поведение:
>>> import awesomemod
>>> awesomemod.thing()
<type 'exceptions.TypeError'>
>>>
TypeError: Oh no!
Этот просто очень странный.
Что мне нужно сделать, чтобы получить поведение встроенных функций?
Редактировать: Я попробовал то, что @ user2864740 предложил в комментарии, и это сработало отлично!
if(something) {
PyErr_SetString(PyExc_TypeError, "Oh no!");
return (PyObject *) NULL;
}