Я написал оболочку Perl XS для библиотеки C, состоящей примерно из 80 функций. Прямо сейчас моя общая стратегия состоит в том, чтобы заменить ошибку функции C на PL_sv_undef
, а вызывающий код Perl должен явно проверить, не является ли возвращаемое значение undef
. (Для некоторых функций C это сложнее, так как я преобразовываю их вывод в HV
/AV
и использую пустой список для сообщения об ошибке.)
Теперь, когда я перешел к написанию больших сценариев Perl с использованием этой библиотеки, я хочу упростить обработку ошибок и использовать, например, обычный eval {}
/die
механизм, похожий на исключение, для обработки ошибок.
На данный момент простой XSUB в моем XS выглядит так:
SV *
simple_function( param1, param2 = 0, param3 = 0)
int param1
int param2
int param3
CODE:
int rc;
rc = simple_function( param1, param2, param3 );
RETVAL = (rc == 0) ? &PL_sv_yes : &PL_sv_undef;
OUTPUT:
RETVAL
Я видел, что некоторые модули имеют глобальный флаг, такой как «RaiseError», в die
при ошибках, но не смог найти ни одного примера, который я мог бы позаимствовать. Несколько модулей, которые я нашел, обрабатывают флаг "RaiseError" внутри .pm
, а не внутри .xs
, и, таким образом, позволяют использовать Perl's die
. В моем случае это довольно сложно реализовать внутри .pm
, так как многие функции требуют специальной проверки ошибок. Это также привело бы к дублированию кода, поскольку проверки уже присутствуют внутри XS.
Я не нашел ничего подходящего в файле perlxs
/perlguts
документации. В частности, я видел вызовы Perl_croak()
в .c
, сгенерированном из моего .xs
, но не нашел никакой документации по этой функции.
Что такое аналог XS для Perl die
? Или как еще XSUB может сообщить во время выполнения Perl, что функция не удалась и нет RETVAL для возврата? Как правильно установить $@
?