Подтвердить что ты не робот

Выбрасывание исключения JavaScript из кода на С++ с помощью Google V8

Я программирую приложение JavaScript, которое обращается к некоторому С++-коду через Google V8.

Все работает отлично, но я не мог понять, как я могу выставить исключение JavaScript, которое можно уловить в JavaScript-коде из метода С++.

Например, если у меня есть функция в С++, например

...
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!
}

Каков правильный способ выбросить исключение V8 из кода на С++?

4b9b3361

Ответ 1

Изменить: Этот ответ предназначен для более старых версий V8. Для текущих версий см. Ответ Сутармина Антона.


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

Ответ 2

В последних версиях ответа v8 Mattew не работает. Теперь в каждой функции, которую вы используете, вы получаете объект Isolate.

Новое создание исключений с помощью объекта Isolate выглядит следующим образом:

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