Ответ 1
Получение исключения в C выполняется путем установки объекта исключения или строки и последующего возврата NULL
из функции.
если я сделаю что-то вроде
>>> 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;
}
Получение исключения в C выполняется путем установки объекта исключения или строки и последующего возврата NULL
из функции.