我应该如何用 NAN 1.x 中的数字代码抛出错误?
How should I throw an error with a numeric code in NAN 1.x?
在 NAN 1.9 中,NanThrowError(const char *msg, const int errorNumber)
方法已弃用,看起来 NAN 2.0 中不存在等效方法。是否有另一种方法可以通过 NAN 获得相同的功能,或者它是否完全消失了?
如果您查看 nan.h
linked in the question 的版本,您会发现已弃用的方法只是创建一个 V8 异常并抛出:
NAN_DEPRECATED NAN_INLINE void NanThrowError(
const char *msg
, const int errorNumber
) {
NanThrowError(Nan::imp::E(msg, errorNumber));
}
namespace Nan { namespace imp {
NAN_INLINE v8::Local<v8::Value> E(const char *msg, const int errorNumber) {
NanEscapableScope();
v8::Local<v8::Value> err = v8::Exception::Error(NanNew<v8::String>(msg));
v8::Local<v8::Object> obj = err.As<v8::Object>();
obj->Set(NanNew<v8::String>("code"), NanNew<v8::Int32>(errorNumber));
return NanEscapeScope(err);
}
} // end of namespace imp
} // end of namespace Nan
我不知道为什么他们在 Github 的变更日志中没有提及这一变更。 V8 引擎可能会发生变化,因此很难确定一个好的默认错误对象。
我认为目前最好的选择是在 class 上编写一个方法,根据消息和错误代码创建一个新的 V8 异常,然后对该异常对象调用 NanThrowError
。您可以使用上面的内部实现作为指南。
它被删除是因为它是不必要的,很容易根据需要实现。
inline v8::Local<v8::Value> makeErrorWithCode(const char *msg, int code) {
NanEscapableScope();
v8::Local<v8::Object> err = NanError(msg).As<v8::Object>();
err->Set(NanNew("code"), NanNew<v8::Int32>(code));
return NanEscapeScope(err);
}
return NanThrowError(makeErrorWithCode("message", 1337));
在 NAN 1.9 中,NanThrowError(const char *msg, const int errorNumber)
方法已弃用,看起来 NAN 2.0 中不存在等效方法。是否有另一种方法可以通过 NAN 获得相同的功能,或者它是否完全消失了?
如果您查看 nan.h
linked in the question 的版本,您会发现已弃用的方法只是创建一个 V8 异常并抛出:
NAN_DEPRECATED NAN_INLINE void NanThrowError(
const char *msg
, const int errorNumber
) {
NanThrowError(Nan::imp::E(msg, errorNumber));
}
namespace Nan { namespace imp {
NAN_INLINE v8::Local<v8::Value> E(const char *msg, const int errorNumber) {
NanEscapableScope();
v8::Local<v8::Value> err = v8::Exception::Error(NanNew<v8::String>(msg));
v8::Local<v8::Object> obj = err.As<v8::Object>();
obj->Set(NanNew<v8::String>("code"), NanNew<v8::Int32>(errorNumber));
return NanEscapeScope(err);
}
} // end of namespace imp
} // end of namespace Nan
我不知道为什么他们在 Github 的变更日志中没有提及这一变更。 V8 引擎可能会发生变化,因此很难确定一个好的默认错误对象。
我认为目前最好的选择是在 class 上编写一个方法,根据消息和错误代码创建一个新的 V8 异常,然后对该异常对象调用 NanThrowError
。您可以使用上面的内部实现作为指南。
它被删除是因为它是不必要的,很容易根据需要实现。
inline v8::Local<v8::Value> makeErrorWithCode(const char *msg, int code) {
NanEscapableScope();
v8::Local<v8::Object> err = NanError(msg).As<v8::Object>();
err->Set(NanNew("code"), NanNew<v8::Int32>(code));
return NanEscapeScope(err);
}
return NanThrowError(makeErrorWithCode("message", 1337));