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

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

 >>> 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? Я нашел для него документацию, но я не уверен, что знаю, как правильно ее использовать.

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

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

    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
    >>> 
    
  2. PyErr_Occurred():

    if(something) {
        PyErr_SetString(PyExc_TypeError, "Oh no!");
        PyErr_Occurred();
    }
    

    Поведение:

    >>> import awesomemod
    >>> awesomemod.thing()
    >>>
    TypeError: Oh no!
    >>>
    

    Так что это вроде как поздно...

  3. 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;
 }

Ответ 1

Получение исключения в C выполняется путем установки объекта исключения или строки и последующего возврата NULL из функции.