我为一个包含约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
Run Code Online (Sandbox Code Playgroud)
我已经看到一些模块有die关于错误的"RaiseError"的全局标志,但未能找到任何我可以借用的例子.我发现的几个模块处理里面的"RaiseError"标志.pm,而不是在里面.xs,因此允许使用Perl die.在我的情况下,在.pm很多函数内部很难实现需要特殊的错误检查.这也会导致代码重复,因为检查已经存在于XS内部.
我发现perlxs/ perlguts文档中没有任何相关内容.特别是,我已经看到了将呼叫Perl_croak()在.c从我的产生.xs,但未能找到该功能的任何文件.
什么是XS的Perl模拟die?或者XSUB如何报告Perl运行时函数失败并且没有RETVAL返回?如何正确设置$@?