【发布时间】:2010-09-03 01:03:47
【问题描述】:
我已经为一个 C 库编写了一个 Perl XS 包装器,其中包含大约 80 个
功能。现在我的一般策略是用 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 on
错误,但找不到任何我可以借鉴的例子。我拥有的几个模块
发现在.pm 中处理“RaiseError”标志,而不是在.xs 中,并且
因此允许使用 Perl 的die。就我而言,这很难
在.pm 内部实现,因为许多功能需要特殊的错误检查。那
还会导致代码重复,因为 XS 中已经存在检查。
我在perlxs/perlguts 文档中没有发现任何相关内容。特别是,我在.xs 生成的.c 中看到了对Perl_croak() 的调用,但未能找到该函数的任何文档。
Perl 的die 的XS 模拟是什么?或者 XSUB 还能如何向 Perl 报告
函数失败且没有 RETVAL 可返回的运行时?如何正确设置$@?
【问题讨论】: