Создание исключения JavaScript из кода C++ с помощью Google V8

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

Все работает нормально, но я не мог понять, как я могу генерировать исключение JavaScript, которое может быть перехвачено в коде 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!
}

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


person Etan    schedule 02.09.2009    source источник


Ответы (2)


Изменить: этот ответ предназначен для более старых версий 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("...")));
person Matthew Crumley    schedule 02.09.2009
comment
Благодарю вас! Я читал API V8 последние 3 недели и каким-то образом умудрился пропустить это. - person Vortico; 15.07.2012
comment
Я получаю Segmentation fault после того, как моя функция C++ возвращается обратно в JS - person exebook; 01.02.2014

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

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

Isolate* isolate = Isolate::GetCurrent();
isolate->ThrowException(String::NewFromUtf8(isolate, "error string here"));
person Anton Sutarmin    schedule 21.12.2015
comment
isolate->ThrowException(v8::Exception::RangeError(String::NewFromUtf8(isolate, "error string here"))); (Вау, я бы просто использовал Нан.) - person Константин Ван; 13.03.2018