我为一个大约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
错误,但没有找到任何我可以借用的例子。我拥有的几个模块
发现处理.pm
内的“RaiseError”标记,而不是.xs
内部的标记
因此允许使用Perl的die
。在我的情况下,这很难
在.pm
内实现尽可能多的函数需要特殊的错误检查。那
还会导致代码重复,因为检查已经存在于XS中。
我在perlxs
/ perlguts
文档中找不到任何相关内容。特别是,我在Perl_croak()
生成的.c
中看到了对.xs
的调用,但未能找到该函数的任何文档。
Perl die
的XS模拟是什么?或者XSUB如何向Perl报告
运行时函数失败并且没有RETVAL返回?如何正确设置$@
?
答案 0 :(得分:6)
在perlapi
手册页上记录了Perl_croak()here。如该页面上的示例所示,您可以向其传递消息字符串,也可以手动将$ @设置为异常对象并传递NULL。