2011-06-23 32 views
1

xsubpp可以为从.xs文件转换而来的c/C++文件生成异常处理代码。它产生了下面的一段代码,我xsubpp 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: %s\tpropagated", Xname, Xreason); 
ENDHANDLERS 

但是编译生成的代码时,我得到的编译错误为TRY,BEGHANDLERS,包罗万象,ENDHANDLERS没有在perl的头文件中的任何地方定义。我修改了我的代码来定义上述这些令牌。

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

但是我无法给出Xname和Xreason的有意义的定义。上述定义是否正确?我们如何处理上述关键字

+0

你检查,如果这些'#define'令牌可见的实现代码? – iammilind

回答

2

这属于“不要那么做”类别。 (对“医生”的规范答案,当我做X时会感到痛苦)。看看生成的代码:

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

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

Perl对C++的支持很弱。这应该不会令人惊讶; perl是用C语言编写的,针对C语言的外部子程序。

我的建议是:处理异常,但不要使用那些为'免费'提供的klunky异常东西,从xsubpp。请自己编写try ... catch ...块。使catch块将那些捕获的C++异常转换为perl异常。致电Perl_croak致命错误,Perl_warn致命错误。

祝你好运。将perl连接到C/C++并不容易。

一些潜在的有用的链接:

+0

感谢您的建议和链接。现在已经过去几个星期了,我只能写一个最小类的扩展。 – Surya

0

我一无所知xsubpp(或Perl,对于这个问题),但如果抛出的异常可以假设从std::exception派生,那么你可以做这样的事情:

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

然后Xreason可映射到ex.what()Xname比较棘手。你可以使它像typeid(ex).name(),这可能比没有好。

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

0

它看起来就像它以与语言无关的方式收集信息,然后将其传播给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";