Хвърляне на JavaScript изключение от C++ код с помощта на Google V8

Програмирам JavaScript приложение, което има достъп до някакъв C++ код през V8 на Google.

Всичко работи добре, но не можах да разбера как мога да хвърля JavaScript изключение, което може да бъде уловено в JavaScript кода от C++ метода.

Например, ако имам функция в 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. За текущите версии вижте отговора на Sutarmin Anton.


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
Благодаря ти! Четох V8 API през последните 3 седмици и някак си успях да пропусна това. - person Vortico; 15.07.2012
comment
Получавам Segmentation fault, след като моята C++ функция се върне обратно към JS - person exebook; 01.02.2014

В последните версии на v8 отговорът на Mattew не работи. Сега във всяка функция, която използвате, получавате обект 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"))); (Леле, просто бих използвал Nan.) - person Константин Ван; 13.03.2018