2009-09-02 14 views
22

Google'ın V8'i üzerinden bazı C++ kodlarına erişen bir JavaScript uygulaması programlıyorum.Google V8 kullanarak C++ kodundan JavaScript istisnası atma

Her şey iyi çalışıyor, ancak JavaScript kodunda C++ yönteminden yakalanabilen bir JavaScript istisnasını nasıl atabileceğimi anlayamadım. Ben JavaScript maruz

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

gibi C++ bir işlevi varsa, örneğin

, I'ld doğru yolu nedir

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

gibi JavaScript kodunda kullanmak ister C++ kodundan bir V8 istisnası atmak için?

cevap

29

Düzeltme: Bu yanıt, V8'in daha eski sürümleri içindir. Mevcut sürümler için bkz. Sutarmin Anton's Answer.


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

Ayrıca v8::Exception statik fonksiyonları ile daha spesifik bir istisna atabilir: v8 mattew cevabı son sürümlerinde

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

teşekkür ederiz! Son 3 hafta boyunca V8 API'sini okudum ve bir şekilde bunu kaçırmayı başardım. – Vortico

+3

C++ işlevim JS'ye geri döndükten sonra Segmentation fault (hata giderme hatası) alıyorum – exebook

9

çalışmaz. Şimdi kullandığınız her işlevde bir Isolate nesnesi olsun. İzolatı nesne ile

Yeni istisna yetiştirme şuna benzer:

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