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