5

我为一个包含大约 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().cmy 生成的中看到了对 的调用.xs,但未能找到该函数的任何文档。

Perl 的 XS 模拟是die什么?或者 XSUB 如何向 Perl 运行时报告函数失败并且没有 RETVAL 可返回?如何正确设置$@

4

1 回答 1

6

Perl_croak() 记录perlapi手册页上。正如该页面上的示例所示,您可以将消息字符串传递给它,也可以手动将 $@ 设置为异常对象并传递 NULL。

于 2010-09-02T16:45:24.980 回答