从 C++ 抛出 JavaScript 异常使用 Google V8 的代码

发布于 2024-08-03 04:26:58 字数 830 浏览 3 评论 0原文

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

一切工作正常,但我不知道如何抛出 JavaScript 异常,该异常可以通过 C++ 方法在 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 异常的正确方法是什么?

I'm programming a JavaScript application which accesses some C++ code over Google's V8.

Everything works fine, but I couldn't figure out how I can throw a JavaScript exception which can be catched in the JavaScript code from the C++ method.

For example, if I have a function in C++ like

...
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);
...

exposed to JavaScript, I'ld like to use it in the JavaScript code like

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

What is the correct way to throw a V8-exception out of the C++ code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

要走干脆点 2024-08-10 04:26:58

编辑:此答案适用于旧版本的 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("...")));

Edit: This answer is for older versions of V8. For current versions, see Sutarmin Anton's Answer.


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

You can also throw a more specific exception with the static functions in 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("...")));
我的黑色迷你裙 2024-08-10 04:26:58

在 v8 的最新版本中,Mattew 的答案不起作用。现在,在您使用的每个函数中,您都会获得一个 Isolate 对象。

使用 Isolate 对象引发的新异常如下所示:

Isolate* isolate = Isolate::GetCurrent();
isolate->ThrowException(String::NewFromUtf8(isolate, "error string here"));

In last versions of v8 Mattew's answer doesn't work. Now in every function that you use you get an Isolate object.

New exception raising with Isolate object look like this:

Isolate* isolate = Isolate::GetCurrent();
isolate->ThrowException(String::NewFromUtf8(isolate, "error string here"));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文