2009-09-02 5 views
22

Google의 V8을 통해 일부 C++ 코드에 액세스하는 JavaScript 애플리케이션을 프로그래밍하고 있습니다.Google V8을 사용하여 C++ 코드에서 JavaScript 예외를 throw

모든 것이 잘 작동하지만 C++ 메소드의 JavaScript 코드에서 catch 할 수있는 JavaScript 예외를 어떻게 던질 수 있는지 알 수 없습니다. 나는 자바 스크립트에 노출

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

같은 C++에서 함수가있는 경우 예를 들어

, I'ld는 올바른 방법은 무엇

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

같은 자바 스크립트 코드를 사용하려면 C++ 코드에서 V8 예외를 던지려면?

답변

29

편집 :이 답변은 이전 버전의 V8입니다. 현재 버전은 Sutarmin Anton's Answer을 참조하십시오.


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

또한 v8::Exception에 정적 기능을보다 구체적인 예외를 던질 수 : V8 매튜의 대답의 마지막 버전의

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

감사합니다! 나는 지난 3 주 동안 V8 API를 읽고 있었고 어떻게 든 그것을 놓칠 수 있었다. – Vortico

+3

내 C++ 함수가 JS로 돌아온 후'Segmentation fault'가 발생합니다. – exebook

9

이 작동하지 않습니다. 이제 모든 함수에서 Isolate 객체를 얻습니다. 분리 개체와

새로운 예외 모금는 다음과 같다 :

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