26

Google の V8 経由で C++ コードにアクセスする JavaScript アプリケーションをプログラミングしています。

すべて正常に動作しますが、C++ メソッドから JavaScript コードでキャッチできる JavaScript 例外をスローする方法がわかりませんでした。

たとえば、C++ に次のような関数があるとします。

...
using namespace std;
using namespace v8;
...
static Handle<Value> jsHello(const Arguments& args) {
    String::Utf8Value input(args[0]);
    if (input == "Hello") {
        string result = "world";
        return String::New(result.c_str());
    } else {
        // throw exception
    }
}
...
    global->Set(String::New("hello"), FunctionTemplate::New(jsHello));
    Persistent<Context> context = Context::New(NULL, global);
...

JavaScript に公開されているので、次のような JavaScript コードで使用したいと思います

try {
    hello("throw me some exception!");
} catch (e) {
    // catched it!
}

C++ コードから V8 例外をスローする正しい方法は何ですか?

4

2 に答える 2

29

編集:この回答は、V8 の古いバージョン用です。現在のバージョンについては、Sutarmin Anton's Answerを参照してください。


return v8::ThrowException(v8::String::New("Exception message"));

の静的関数を使用して、より具体的な例外をスローすることもできますv8::Exception

return v8::ThrowException(v8::Exception::RangeError(v8::String::New("...")));
return v8::ThrowException(v8::Exception::ReferenceError(v8::String::New("...")));
return v8::ThrowException(v8::Exception::SyntaxError(v8::String::New("...")));
return v8::ThrowException(v8::Exception::TypeError(v8::String::New("...")));
return v8::ThrowException(v8::Exception::Error(v8::String::New("...")));
于 2009-09-02T15:08:46.343 に答える
14

v8 の最新バージョンでは、Mattew の回答は機能しません。これで、使用するすべての関数で Isolate オブジェクトを取得できます。

Isolate オブジェクトを使用した新しい例外の発生は、次のようになります。

Isolate* isolate = Isolate::GetCurrent();
isolate->ThrowException(String::NewFromUtf8(isolate, "error string here"));
于 2015-12-21T13:30:24.090 に答える