Lancer une exception JavaScript du code C++ en utilisant Google V8

je suis en train de programmer une application JavaScript qui accède à du code C++ sur la V8 de Google.

Tout fonctionne bien, mais je n'ai pas trouvé comment je pouvais lancer une exception JavaScript qui peut être capté dans le code JavaScript de la méthode C++.

Par exemple, si j'ai une fonction en 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);
...

exposés à JavaScript, j'aimerais l'utiliser dans le code JavaScript

try {
    hello("throw me some exception!");
} catch (e) {
    // catched it!
}

Quelle est la bonne façon de lancer un V8-exception du code C++?

22
demandé sur Etan 2009-09-02 13:08:54

2 réponses

Edit: Cette réponse est pour les anciennes versions de V8. Pour les versions actuelles, voir réponse de Sutarmin Anton.


return v8::ThrowException(v8::String::New("Exception message"));

vous pouvez également lancer une exception plus spécifique avec les fonctions statiques dans 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("...")));
29
répondu Matthew Crumley 2017-05-23 11:33:14

dans les dernières versions de la réponse de V8 Mattew ne fonctionne pas. Maintenant, dans toutes les fonctions que vous utilisez, vous obtenez un Isolat objet.

Nouvelle exception de sensibilisation à Isoler l'objet ressembler à ceci:

Isolate* isolate = Isolate::GetCurrent();
isolate->ThrowException(String::NewFromUtf8(isolate, "error string here"));
11
répondu Anton Sutarmin 2016-02-10 12:15:07