2009-09-02 19 views
22

Programuję aplikację JavaScript, która uzyskuje dostęp do kodu C++ za pomocą V8 w Google.Rzucanie wyjątku JavaScriptu z kodu C++ przy użyciu Google V8

Wszystko działa dobrze, ale nie mogłem wymyślić, w jaki sposób mogę rzucić wyjątek JavaScript, który może być przechwycony w kodzie JavaScript z metody C++.

Na przykład, jeśli mam funkcji w C++ jak

... 
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); 
... 

narażone na JavaScripcie, I'ld lubią używać go w kodzie JavaScript jak

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

Co to jest poprawny sposób rzucić wyjątek V8 z kodu C++?

Odpowiedz

29

Edytuj: Ta odpowiedź dotyczy starszych wersji V8. Aktualne wersje, zobacz Sutarmin Anton's Answer.


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

Można też rzucać bardziej specyficzny wyjątek z funkcji statycznych w 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

Dziękujemy! Czytałem API V8 przez ostatnie 3 tygodnie i jakoś udało mi się tego nie zauważyć. – Vortico

+3

Otrzymuję komunikat "Błąd segmentacji" po powrocie funkcji C++ z powrotem do JS – exebook

9

W ostatnich wersjach odpowiedź v8 Mattew nie działa. Teraz w każdej używanej funkcji otrzymasz obiekt izolowania.

New podnoszenie wyjątek z obiektem Isolate wyglądać następująco:

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