gpt4 book ai didi

javascript - 在 V8 中从 C++ 代码创建自定义错误类

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:02 25 4
gpt4 key购买 nike

我想在原生 NodeJS (0.11.5) 扩展中创建自定义异常。我正在尝试在 V8 (3.20.11) 中创建内置 Error 类的子类。

基本上,我正在寻找与以下 Javascript 代码等效的 C++:

function MyError(message) {
Error.apply(this, arguments);
this.message = message;
}
MyError.prototype = new Error;
MyError.prototype.name = MyError.name;

new MyError("message")

我尝试挖掘 V8 源代码,发现以下辅助方法似乎可以完成我想要的部分操作:

Handle<Object> Factory::NewError(const char* constructor,
Handle<String> message)

不幸的是,它看起来像是一个私有(private) API,我对 V8 的了解还不够多,无法自己弄清楚如何构建类似的东西。如果能够编写一个我可以以类似于创建内置 Error 实例的方式使用的方法,例如:

ThrowException(v8::Exception::Error(v8::String::New(msg)))
// becomes...
ThrowException(MyError(v8::String::New(msg)))

我正在寻找尽可能接近内置 Error 类子类的解决方案。它应该大概满足以下条件:

var e = new MyError("message");
assert(e instanceof MyError);
assert(e instanceof Error);
assert(e.name === "MyError");
assert(e.message === "message");

有什么建议从哪里开始?

最佳答案

我不太了解 NodeJS,但一种可能是抛出任何有意义的 C++ 异常,在扩展边界捕获它,使用标准 V8 调用构造适当的 JavaScript 异常,然后调用 v8: :ThrowException()。如果 NodeJS 不让您的扩展直接访问 V8,则此方法可能不是一个选项。

这是一个示例程序,展示了如何设置自定义错误类并从 C++ 对其进行实例化。希望 NodeJS 给你足够的 V8 访问权限来做类似的事情:

#include "v8.h"
#include <iostream>

static void Print(v8::Handle<v8::Value> value)
{
std::cout << *v8::String::Utf8Value(value) << std::endl;
}

static v8::Local<v8::Value> RunScript(const char* code)
{
return v8::Script::Compile(v8::String::New(code))->Run();
}

static void RunTest(v8::Isolate* isolate)
{
// setup
v8::Locker locker(isolate);
v8::Isolate::Scope isolateScope(isolate);
v8::HandleScope handleScope(isolate);
auto context = v8::Context::New(isolate);
v8::Context::Scope contextScope(context);

// create custom error class/function
auto code =
"function MyError(message) {"
"Error.apply(this, arguments);"
"this.message = message;"
"}"
"MyError.prototype = new Error;"
"MyError.prototype.name = MyError.name;"
"MyError";
auto errorFunc = RunScript(code)->ToObject();

// create custom error instance
auto message = v8::String::New("message");
v8::Handle<v8::Value> args[] = { message };
auto error = errorFunc->CallAsConstructor(1, args);

// validate custom error instance
context->Global()->Set(v8::String::New("e"), error);
Print(RunScript("e instanceof MyError"));
Print(RunScript("e instanceof Error"));
Print(RunScript("e.name === 'MyError'"));
Print(RunScript("e.message === 'message'"));
}

void main(void)
{
auto isolate = v8::Isolate::New();
RunTest(isolate);
isolate->Dispose();
}

关于javascript - 在 V8 中从 C++ 代码创建自定义错误类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18360609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com