假设我有这段代码:
Local<Script> script = Script::Compile(String::New("x1 = 1;"), String::New("main.js"));
printf("before run\n");
script->Run();
printf("after run\n");
创建并输入了上下文。
此代码的输出为:
before run
after run
这是预期的。但是如果将一些javascript代码放入包含语法错误的source
(例如".x11 = 1"
),那么输出为:
main.js:0: Uncaught SyntaxError: Unexpected token .
before execution.
Segmentation fault (core dumped)
如果编译有错误但是如何检查它,也许我不应该调用Run
?
另外:(代码来自Getting Starget - Chrome V8 +代码,语法错误=同样的事情)
#include <v8.h>
using namespace v8;
int main(int argc, char* argv[]) {
// Get the default Isolate created at startup.
Isolate* isolate = Isolate::GetCurrent();
// Create a stack-allocated handle scope.
HandleScope handle_scope(isolate);
// Create a new context.
Handle<Context> context = Context::New(isolate);
// Here's how you could create a Persistent handle to the context, if needed.
Persistent<Context> persistent_context(isolate, context);
// Enter the created context for compiling and
// running the hello world script.
Context::Scope context_scope(context);
// Create a string containing the JavaScript source code.
Handle<String> source = String::New(".>make.some.syntax.errors<");
// Compile the source code.
Handle<Script> script = Script::Compile(source);
// Run the script to get the result.
Handle<Value> result = script->Run();
// The persistent handle needs to be eventually disposed.
persistent_context.Dispose();
// Convert the result to an ASCII string and print it.
String::AsciiValue ascii(result);
printf("%s\n", *ascii);
return 0;
}
答案 0 :(得分:1)
经过一段时间的头痛后,我找到了解决办法。
当脚本编译失败时,它不会向v8::Handle
返回任何内容。因此,在这种情况下,script.IsEmpty()
返回true。
为了清楚说明,我在Google的Hello World代码中进行了一些修改:
#include <v8.h>
using namespace v8;
int main(int argc, char* argv[]) {
// Get the default Isolate created at startup.
Isolate* isolate = Isolate::GetCurrent();
// Create a stack-allocated handle scope.
HandleScope handle_scope(isolate);
// Create a new context.
Handle<Context> context = Context::New(isolate);
// Here's how you could create a Persistent handle to the context, if needed.
Persistent<Context> persistent_context(isolate, context);
// Enter the created context for compiling and
// running the hello world script.
Context::Scope context_scope(context);
// Create a string containing the JavaScript source code.
Handle<String> source = String::New(".>no.matter.what.code.is<");
// Compile the source code.
Handle<Script> script = Script::Compile(source);
if(!script.IsEmpty()) // is script compiled ?
{
// Run the script to get the result.
Handle<Value> result = script->Run();
// Convert the result to an ASCII string and print it.
String::AsciiValue ascii(result);
printf("%s\n", *ascii);
}
// The persistent handle needs to be eventually disposed.
persistent_context.Dispose();
return 0;
}
答案 1 :(得分:0)
基于sample / process.cc的v8源代码:
// catch any exceptions the script might throw.
TryCatch try_catch(GetIsolate());
// Compile the script and check for errors.
Local<Script> compiled_script;
if (!Script::Compile(context, script).ToLocal(&compiled_script)) {
String::Utf8Value error(GetIsolate(), try_catch.Exception());
Log(*error);
// The script failed to compile; bail out.
return false;
}
// Run the script!
Local<Value> result;
if (!compiled_script->Run(context).ToLocal(&result)) {
// The TryCatch above is still in effect and will have caught the error.
String::Utf8Value error(GetIsolate(), try_catch.Exception());
Log(*error);
// Running the script failed; bail out.
return false;
}
我希望这会有所帮助。