2009-09-02 16 views
22

Estoy programando una aplicación JavaScript que accede a algún código C++ sobre el V8 de Google.Lanzar una excepción JavaScript desde el código C++ usando Google V8

Todo funciona bien, pero no pude entender cómo puedo lanzar una excepción de JavaScript que se puede atrapar en el código JavaScript del método C++.

Por ejemplo, si tengo una función en C++ como

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

expuesto a JavaScript, I'ld gustaría usarlo en el código JavaScript como

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

Cuál es la forma correcta lanzar una excepción V8 fuera del código C++?

Respuesta

29

Editar: Esta respuesta es para versiones anteriores de V8. Para las versiones actuales, vea Sutarmin Anton's Answer.


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

También puede lanzar una excepción más específica con las funciones estáticas en 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

Gracias! He estado leyendo la API V8 durante las últimas 3 semanas y de alguna manera me las arreglé para perder esto. – Vortico

+3

Me sale 'Error de segmentación' después de que mi función C++ vuelve a JS – exebook

9

En las últimas versiones de respuesta V8 de Mateo no funciona. Ahora en cada función que usas obtienes un objeto Aislar.

Nueva recaudación de excepción, con objeto Aislar el siguiente aspecto:

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