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

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

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

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

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

One Solution collect form web for “Как правильно использовать API и исключения API Python?”

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

  • В Python, почему модуль, реализованный на C быстрее, чем чистый модуль Python, и как его написать?
  • Расширение Python - создание и проверка больших целых чисел эффективно
  • API Python C: вызов функции Python с аргументами, переданными по ссылке
  • Привязать к pgcrypto из python
  • Внедрение Python в C - импорт модулей
  • массив numpy C api
  • Вызов метода python из C ++ (или C) обратного вызова
  • Когда вызывается PyEval_InitThreads?
  • Global Interpreter Lock и доступ к данным (например, для массивов NumPy)
  • Определение PyBufferProcs в Python 2.7, когда класс реализует PEP 3118
  • API Python C Как передать массив структур с C на Python
  • Python - лучший язык программирования в мире.