我应该如何用 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));