node motor machine jugo google chrome blog javascript c++ v8

motor - Lanzar una excepción de JavaScript desde el código C++ usando Google V8



v8 motor javascript (2)

En las últimas versiones de v8 la respuesta de Mattew no funciona. Ahora en cada función que usas obtienes un objeto aislado.

La nueva excepción que plantea con el objeto aislado se ve así:

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

Estoy programando una aplicación JavaScript que accede a un código C ++ sobre el V8 de Google.

Todo funciona bien, pero no pude descubrir cómo puedo lanzar una excepción de JavaScript que puede ser atrapada en el código JavaScript desde el 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, me 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 de lanzar una excepción V8 del código C ++?


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