2009-09-02 4 views
22

Je suis en train de programmer une application JavaScript qui accède à du code C++ sur le V8 de Google.Jeter une exception JavaScript à partir du code C++ en utilisant Google V8

Tout fonctionne bien, mais je ne pouvais pas comprendre comment je peux lancer une exception JavaScript qui peut être interceptée dans le code JavaScript de la méthode C++.

Par exemple, si j'ai une fonction en C++ comme

... 
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é à JavaScript, I'ld souhaitez utiliser dans le code JavaScript comme

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

Quelle est la bonne façon jeter une exception V8 hors du code C++?

Répondre

29

Modifier: Cette réponse est pour les anciennes versions de V8. Pour les versions actuelles, voir Sutarmin Anton's Answer.


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

Vous pouvez également lancer une exception spécifique plus 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("..."))); 
+0

Merci! J'ai lu l'API V8 depuis 3 semaines et j'ai raté ça. – Vortico

+3

Je reçois 'Segmentation fault' après que ma fonction C++ retourne à JS – exebook

9

Dans ces dernières versions de la réponse de v8 Mattew ne fonctionne pas. Maintenant, dans chaque fonction que vous utilisez, vous obtenez un objet Isolate.

Nouvelle levée d'exception avec Isoler objet ressemble à ceci:

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