xsubpp c++ exceptions
xsubpp c++ exceptions
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";
- Exceptions on iostreams
- 如果您属于"we don't use exceptions"阵营,那么您如何使用标准库?
- OpenCV fitLine exceptions
- BOOST_NO_EXCEPTIONS是否可以保证与-fno -exceptions的兼容性
- GCC arm-none-eabi (Codesourcery) and C++ Exceptions
- iPhone C++/Objective-C exceptions
- "cin.exceptions"和"exception"在这里是什么意思
- Do exceptions/errors在C++中也设置了错误号
- Linux3/GCC46:"-fnon-call-exceptions",哪些信号是陷阱指令?
- Android CMake build默认添加no-exceptions和no-rtti
- 节点.js带有 GYP "exceptions"的附加组件
- xsubpp c++ exceptions
- Android NDK / Exceptions?
- exceptions advantages over Enums