【问题标题】:How can Perl's XSUB die?Perl 的 XSUB 怎么会死?
【发布时间】: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 可返回的运行时?如何正确设置$@

【问题讨论】:

    标签: perl xs perl-xs


    【解决方案1】:

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

    【讨论】:

    • 只有一个问题。为什么是死亡而不是死亡?还是拉里的另一个聪明才智?
    • 不,Zefram 的。这是hackish 的用法,因为它源自关键字die
    猜你喜欢
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 2020-11-13
    • 2012-10-25
    • 2011-02-05
    • 2013-04-23
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多