26

我正在编写一个 JavaScript 应用程序,它通过 Google 的 V8 访问一些 C++ 代码。

一切正常,但我不知道如何抛出可以在 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 的回答


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 回答