Как правильно использовать Python C API и исключения?

если я сделаю что-то вроде

 >>> x = int(1,2,3,4,5)

Я сразу же получаю фатальную ошибку (такую, которая прервала бы выполнение программы, если бы она была в заранее написанном скрипте)

 Traceback (most recent call last):
   File "", line 1, in 
 TypeError: int() takes at most 2 arguments (5 given)

а такжеx остается неопределенным:

 >>> x
 Traceback (most recent call last):
   File "", line 1, in 
 NameError: name 'x' is not defined

Как бы я реализовать это в Python?с C API? Я нашел некоторыедокументация за это, но я не уверен, что знаю, как правильно его использовать.

Вот что я пытался:

Распечатать:

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()

>>>
TypeError: Oh no!

Этот просто очень странный.

Что мне нужно сделать, чтобы получить поведение встроенных функций?

Редактировать: Я попробовал то, что @ user2864740 предложил в комментарии, и это сработало отлично!

 if(something) {
     PyErr_SetString(PyExc_TypeError, "Oh no!");
     return (PyObject *) NULL;
 }

Ответы на вопрос(1)

Ваш ответ на вопрос