我为一个包含大约 80 个函数的 C 库编写了一个 Perl XS 包装器。现在我的一般策略是用 C 函数中的错误替换,PL_sv_undef
调用 Perl 代码必须明确检查返回是否不是undef
。(对于某些 C 函数,它更复杂,因为我将它们的输出转换为HV
/AV
并使用空列表来报告错误。)
现在,当我开始使用该库编写更大的 Perl 脚本时,我想简化错误处理并使用例如通常eval {}
/die
类似异常的机制来处理错误。
目前,我的 XS 中的一个简单 XSUB 看起来像这样:
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
my 生成的中看到了对 的调用.xs
,但未能找到该函数的任何文档。
Perl 的 XS 模拟是die
什么?或者 XSUB 如何向 Perl 运行时报告函数失败并且没有 RETVAL 可返回?如何正确设置$@
?