если я сделаю что-то вроде
>>> 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
Как я могу реализовать это в API Python C? Я нашел для него документацию, но я не уверен, что знаю, как правильно ее использовать.
Вот что я пытался:
-
Распечатать:
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;
}