2016-04-03 6 views
2

私はnodejs C++モジュールを持っています。初期化エラーを報告する方法を理解したいと思います。したがって、このための定型は次のとおりです。nodejsモジュール初期化関数からのエラーの報告

extern "C" void Initialize(v8::Handle<v8::Object> instance) 
{ 
    // Do initialization stuff 
} 

NODE_MODULE(SomeModuleType, Initialize) 

それは戻り値の型を持っていないし、私はそれがextern "C"あるので、投げることは許されないのです場合、私はInitialize内部エラーを報告するにはどうすればよいですか?私が呼び出すべき特定のコールバックがありますか?

また、nodejsに公開されているコールバックメソッドからエラーをレポートするベストプラクティスは何ですか?ヌルオブジェクトを一般的なプラクティスに戻しているのですか、そこに投げて、JavaScriptの面で例外として表示されますか?

+1

'extern" C "'は、C++固有のコードや 'throw'のようなステートメントを使うことができないということを意味するものではなく、[* name mangling *](https://en.wikipedia) .org/wiki/Name_mangling)。 –

+0

さて、私は部分的にしか同意しませんでした。呼び出し元がCコードの場合、UBになります。 –

+1

nodejsモジュールがCアプリケーションによってロードされることは疑いの余地がありますが、その可能性は薄いです。まず、非C++アプリケーションは関数に正しい引数を渡すことができません。 –

答えて

1

私がダウンしてこれに来たソースをnodejs周りに潜ん後に、しかしコメントはまだこれは良いアプローチである場合については、歓迎されています

extern "C" void Initialize(v8::Handle<v8::Object> instance) 
{ 
    try 
    { 
     // Do something unsafe 
    } 
    catch (std::exception& Exception) 
    { 
     node::Environment::GetCurrent(v8::Isolate::GetCurrent())->ThrowError("module initialization failed"); 
    } 
} 

私は単に例外を再スローした場合、デバッガの下で実行は続きますそれは私が望むものではありません。