Я написал оболочку 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 die
. В моем случае это довольно сложно
реализовать внутри .pm
, так как многие функции требуют специальных проверок ошибок. Тот
также приведет к дублированию кода, поскольку проверки уже присутствуют внутри XS.
Я не нашел ничего релевантного в документации perlxs
/ perlguts
. В частности, я видел вызовы Perl_croak()
в .c
, сгенерированные из моего .xs
, но не удалось найти какую-либо документацию для функции.
Что такое XS-аналог Perl die
? Или как еще XSUB может сообщить Perl
во время выполнения, что функция завершилась сбоем и нет возврата для возврата? Как правильно установить $@
?