xsubpp c++ exceptions

xsubpp c++ exceptions

本文关键字:exceptions c++ xsubpp      更新时间:2023-10-16

xsubpp可以为从.xs文件转换而来的c/c++文件生成异常处理代码。它为我生成以下代码

TRY {
    char *  CLASS = (char *)SvPV_nolen(ST(0));
    Example *   RETVAL;
    RETVAL = new Example();
    ST(0) = sv_newmortal();
    sv_setref_pv( ST(0), CLASS, (void*)RETVAL );
}
BEGHANDLERS
CATCHALL
    sprintf(errbuf, "%s: %stpropagated", Xname, Xreason);
ENDHANDLERS

但是在编译生成的代码时,我会遇到编译错误,因为在perl头文件中没有定义TRY、BEGHANDLERS、CATCHALL、ENDHANDLERS。我已经修改了我的代码来定义上面提到的像这样的令牌。

#define TRY try
#define BEGHANDLERS
#define CATCHALL catch (...) {
#define ENDHANDLERS }

但我不能给Xname和Xreason下有意义的定义。以上定义正确吗?我们如何处理上面提到的关键字

这属于"那就不要那样做"类别。("医生,我做X的时候很疼"的典型答案)。查看生成的代码:

CATCHALL
    sprintf(errbuf, "%s: %stpropagated", Xname, Xreason);
ENDHANDLERS

这不会传播异常。它打印了一条消息,然后完全忽略了发生错误的事实!

Perl对C++的支持相当弱。这并不奇怪;perl是用C语言编写的,它的外部子例程以C为目标。

我的建议是:一定要处理异常,但不要使用xsubpp免费提供的那些相当笨拙的异常。相反,自己编写try ... catch ...块。使catch块将那些捕获的C++异常转换为perl异常。如果出现致命错误,请调用Perl_croak;如果出现非致命错误,则调用Perl_warn

祝你好运。将perl与C/C++接口并不容易。

一些潜在的有用链接:

  • "我怎样才能使用Perl中的C++类?"我怎样才能从Perl中使用C++类
  • "将C++和Perl粘合在一起",http://www.johnkeiser.com/perl-xs-c++.html
  • "使用XS将Perl与C++接口",http://adventures-in-perl.blogspot.com/2010/08/interfacing-perl-with-c-external-files.html
  • "自动插入包装器以处理C++异常",http://www.mail-archive.com/perl-xs@perl.org/msg02248.html

我对xsubpp(或Perl)一无所知,但如果可以假设抛出的异常派生自std::exception,那么您可以执行以下操作:

#define CATCHALL catch(const std::exception& ex) {

则CCD_ 7可以被映射到CCD_。Xname更为棘手。你可以把它做成类似typeid(ex).name()的东西,这可能比什么都没有要好。

这是我能想到的最好的解决方案,除非有一些特定于xsubpp的技巧。

看起来它是以一种与语言无关的方式收集信息,然后将其传播到perl。您显示的代码正在生成消息,然后它应该生成代码来传播它:

ENDHANDLERS
if (errbuf[0])
Perl_croak(aTHX_ errbuf);

所以你只需要挑选出你认为对试图调试它的人有用的东西。我认为在消息中包括异常来自C++会很有用;正如前面的回答所说,包括e.what()中的细节。因此,包括这样的东西应该有效:

#include <stdexcept>
#define TRY try
#define BEGHANDLERS catch(std::exception const &e){
#define CATCHALL const char * Xreason = e.what();
#define ENDHANDLERS }
const char * Xname = "C++ exception";