2011-06-23 13 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

これらのトークンが実装コードに見えるかどうかチェックしましたか? – iammilind

答えて

2

これは「あまりやっていない」カテゴリに該当します。 (「医者、私がXをするときに痛い」に対する標準的な答え)。生成されたコードを見てください:

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

これは例外を伝播していません。メッセージを出力して、エラーが発生したという事実を完全に無視しています!

PerlのC++のサポートはかなり弱いです。それは驚くべきことではありません。 perlはC言語で書かれていて、C言語の外部サブルーチンを対象としています。

私の提案:例外を処理しますが、xsubppから '無料'のために提供されているむしろ大量の例外的なものを使用しないでください。代わりに、try ... catch ...ブロックを自分で作成してください。 catchブロックが、捕捉されたC++例外をperl例外に変換するようにします。致命的なエラーの場合はPerl_croak、致命的でない場合はPerl_warnとしてください。

幸運。 PerlとC/C++とのインターフェースは簡単ではありません。

いくつかの潜在的に有用なリンク:

+0

提案とリンクをありがとう。今は数週間ぐらいですが、私は最小限のクラスの拡張機能しか書けません。 – Surya

0

私は(そのことについてやPerl、)にxsubppについて何も知らないが、スローされた例外がstd::exceptionから派生すると仮定することができれば、あなたはこのような何か行うことができます:

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

Xreasonex.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";