2009-09-02 34 views
22

Tôi đang lập trình một ứng dụng JavaScript truy cập một số mã C++ trên V8 của Google.Ném ngoại lệ JavaScript từ mã C++ bằng Google V8

Mọi thứ hoạt động tốt, nhưng tôi không thể tìm ra cách tôi có thể ném một ngoại lệ JavaScript có thể được nắm bắt trong mã JavaScript từ phương thức C++.

Ví dụ, nếu tôi có một hàm trong C++ như

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

tiếp xúc với JavaScript, I'ld muốn sử dụng nó trong mã JavaScript như

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

cách chính xác là gì thế nào để ném một ngoại lệ V8 ra khỏi mã C++?

Trả lời

29

Chỉnh sửa: Câu trả lời này dành cho các phiên bản V8 cũ hơn. Đối với các phiên bản hiện tại, hãy xem Sutarmin Anton's Answer.


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

Bạn cũng có thể ném một ngoại lệ cụ thể hơn với các chức năng tĩnh trong 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

Cảm ơn bạn! Tôi đã đọc API V8 trong 3 tuần qua và bằng cách nào đó đã quản lý được điều này. – Vortico

+3

Tôi nhận được 'Segmentation fault' sau khi hàm C++ trả về JS – exebook

9

Trong các phiên bản cuối cùng của câu trả lời v8 Mattew của không hoạt động. Bây giờ trong mọi chức năng mà bạn sử dụng, bạn sẽ có được một đối tượng Cô lập.

nâng cao ngoại lệ mới với đối tượng Cô lập giống như thế này:

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