Js解释器V8引擎嵌入的异常处理
2011年08月10日
v8引擎为Google开发的JS语言解释器有着高效易用等特点,通常它执行一个Js脚本需要经过编译和运行步骤,
由于我们的脚本程序很可能不正确,随时造成过程环节的异常,我们来解决一个异常以及错误的捕捉和处理过程,如下脚本:
test.js: 使用以下经典的V8 C++示例代码来执行脚本: #include
usingnamespace v8;
//提取js文件
v8::Handle::String> ReadFile(constchar* name)
{
FILE* file = fopen(name, "rb");
if (file == NULL) return v8::Handle::String>();
fseek(file, 0, SEEK_END);
int size = ftell(file);
rewind(file);
char* chars =newchar[size +1];
chars[size] ='\0';
for (int i =0; i ::Handle::String> result = v8::String::New(chars, size);
delete[] chars;
return result;
}
int main()
{
HandleScope handle_scope;
Handle context = Context::New();
Context::Scope context_scope(context);
constchar* fname ="test.js";
Handle source = ReadFile(fname);
//ExecuteString(source, String::New(fname), true, true);
Handle script = Script::Compile(source);
Handle result = script->Run();
String::AsciiValue ascii(result);
printf("%s\n", *ascii);
return0;
}
然后编译程序
# g++ -o test test.cpp -lv8
# ./test
:58: Uncaught ReferenceError: alert is not defined
Segmentation fault
在执行过程遇到JS语法错误时,V8很干脆地中上了进程,提醒段错误。
在这我们正常应用环境是无法使用的,需要有一种异常处理机制来收集并处理错误。
这就是v8::TryCatch ,在编译前声明,在之后的编译和执行中只要有错误的发生均可捕获。
查找了相关的V8源代码,改进后的代码实现如下(函数体),
其中source为源文件内容,name用来标记当前脚本名称(文件名),
print_result表示是否打印脚本执行结果,report_exceptions表示是否报告异常(错误): bool ExecuteString(v8::Handle::String> source,
v8::Handle::Value> name,
bool print_result,
bool report_exceptions)
{
v8::HandleScope handle_scope;
v8::TryCatch try_catch; //这里设置异常机制
v8::Handle::Script> script = v8::Script::Compile(source, name);
if (script.IsEmpty()) {
// Print errors that happened during compilation.
if (report_exceptions)
ReportException(&try_catch);
returnfalse;
} else {
v8::Handle::Value> result = script->Run();
if (result.IsEmpty()) {
assert(try_catch.HasCaught());
// Print errors that happened during execution.
if (report_exceptions)
ReportException(&try_catch);
returnfalse;
} else {
assert(!try_catch.HasCaught());
if (print_result &&!result->IsUndefined()) {
// If all went well and the result wasn't undefined then print
// the returned value.
v8::String::Utf8Value str(result);
constchar* cstr = ToCString(str);
printf("%s\n", cstr);
}
returntrue;
}
}
}
相关的异常处理函数: constchar* ToCString(const v8::String::Utf8Value& value) {
return*value ?*value : "";
}
void ReportException(v8::TryCatch* try_catch) {
v8::HandleScope handle_scope;
v8::String::Utf8Value exception(try_catch->Exception());
constchar* exception_string = ToCString(exception);
v8::Handle::Message> message = try_catch->Message();
if (message.IsEmpty()) {
// V8 didn't provide any extra information about this error; just
// print the exception.
printf("%s\n", exception_string);
} else {
// Print (filename):(line number): (message).
v8::String::Utf8Value filename(message->GetScriptResourceName());
constchar* filename_string = ToCString(filename);
int linenum = message->GetLineNumber();
printf("%s:%i: %s\n", filename_string, linenum, exception_string);
// Print line of source code.
v8::String::Utf8Value sourceline(message->GetSourceLine());
constchar* sourceline_string = ToCString(sourceline);
printf("%s\n", sourceline_string);
// Print wavy underline (GetUnderline is deprecated).
int start = message->GetStartColumn();
for (int i =0; i GetEndColumn();
for (int i = start; i ::String::Utf8Value stack_trace(try_catch->StackTrace());
if (stack_trace.length() >0) {
constchar* stack_trace_string = ToCString(stack_trace);
printf("%s\n", stack_trace_string);
}
}
}
int main(int argc, char* argv[])
{
HandleScope handle_scope;
Handle context = Context::New();
Context::Scope context_scope(context);
constchar* fname ="test.js";
Handle source = ReadFile(fname);
ExecuteString(source, String::New(fname), true, true);
return0;
}
重新编译后运行结果为:
# ./test
test.js:3: ReferenceError: alert is not defined
alert(str);
^
ReferenceError: alert is not defined
at test.js:3:1
已经可以正常报告错误。
发表评论
-
Keil C51 uv2中sprintf打印char的问题
2012-01-20 11:39 1620Keil C51 uv2中sprintf打印char的问题 ... -
[转载]cortex-m3笔记(1)GPIO-volatile-inline-Static
2012-01-20 11:39 800[转载]cortex-m3笔记(1)GPIO-volatile ... -
[转载]高一语文必修一寒假作业二
2012-01-20 11:39 659[转载]高一语文必修一 ... -
[转载]浙江杭西高2011年5月高二地理(徐霞客游记TV版-
2012-01-20 11:39 740[转载]浙江杭西高2011年5月高二地理(徐霞客游记TV版- ... -
在 flash.net.NetStream 上找不到属性 onMetaData
2012-01-19 16:30 979在 flash.net.NetStream 上找不到属性 on ... -
javascript高级程序设计 -- 读书笔记(一)
2012-01-19 16:29 538javascript高级程序设计 -- 读书笔记(一) 20 ... -
域的应用(一)
2012-01-19 16:29 563域的应用(一) 2010年06月 ... -
SWF加载和调用另一个SWF中的类中函数
2012-01-19 16:29 732SWF加载和调用另一个SWF中的类中函数 2010年12月2 ... -
三年级作文批改记录
2012-01-17 06:14 728三年级作文批改记录 2011年05月31日 小学生作文批 ... -
作文批改
2012-01-17 06:14 558作文批改 2011年04月29日 ... -
作文的指导、批改和讲评
2012-01-17 06:14 474作文的指导、批改和讲 ... -
教小学生写作文1
2012-01-17 06:14 649教小学生写作文1 2011年09月09日 一、小学作文教 ... -
小学生期末评语
2012-01-17 06:14 602小学生期末评语 2010年0 ... -
梦想的天空,神马都是浮云
2012-01-16 04:55 607梦想的天空,神马都是浮云 2011年05月06日 活 ... -
神马都是浮云
2012-01-16 04:54 560神马都是浮云 2011年12月04日 天气变本加厉地冷起 ... -
以后谢绝谈情,神马都是浮云。
2012-01-16 04:54 486以后谢绝谈情,神马都是浮云。 2011年12月23日 恋 ... -
【滚~!远点】神马都是浮云?
2012-01-16 04:54 670【滚~!远点】神马都是浮云? 2011年12月08日 【 ... -
神马都是浮云,我却为浮云而奋斗
2012-01-16 04:54 579神马都是浮云,我却为浮云而奋斗 2011年12月04日 ...
相关推荐
c# 、asp.net 在后台使用谷歌V8引擎执行js,将示例工程中的GoogleV8Engine.cs文件复制到你的项目中。将GoogleV8Engine_x64.dll 和 GoogleV8Engine_x86.dll 两个非托管DLL文件拷贝到工程部署的DLL目录下(ASP.Net拷贝...
V8 最早被开发用以嵌入到 Google 的开源浏览器 Chrome 中,但是 V8 是一个可以独立的模块,完全可以嵌入您自己的应用,著名的 Node.js( 一个异步的服务器框架,可以在服务端使用 JavaScript 写出高效的网络服务器 ) ...
包含 VS2010编译出来的V8静态库 Release版 还有Demo代码
V8 javascript引擎源代码V8 javascript引擎源代码V8 javascript引擎源代码V8 javascript引擎源代码
在android应用程序中嵌入v8引擎的演示应用程序
V8 Javascript Engine for PHP — 这个PHP扩展用于嵌入谷歌的V8 Javascript引擎
V8在运行之前将JavaScript编译成了机器码,而非字节码或是解释执行 它,以此提升性能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译...
编写Python API,然后使用V8引擎从JavaScript中调用它们。使用V8引擎从JavaScript中调用Python API
谷歌浏览器的脚本引擎、JavaScript解释器:V8。checkout日期:2009-4-19
配套“编译v8引擎”文章使用 chrome浏览器js解析引擎 node.js
V8 JavaScript引擎的PHP扩展
Chrome V8 JavaScript引擎 源代码
v8版本8.0.397 win10下vs2019编译的x64静态库 debug版本/MDd release版本/MD
chrome_v8_js引擎源码导读分析 第一章 v8 之整体流程 第二章 v8 之全局环境配置及初始化 2.1 全局模板 2.2 库函数 2.3 初始化 第三章 v8 之前端建立语法树 3.1 v8 编译中重要的类 3.2 compile之前的查找 ...
配套“编译v8引擎”文章使用 chrome浏览器js解析引擎 node.js
Chrome V8 JavaScript解析器引擎源代码(V8 JavaScript Engine)
易语言使用v8引擎(基于UseDotNet)。v8.e 中的 V8Engine类 与 Handle类 是由 类库查看器生成的代码。v8.net 介绍 。http://blog.csdn.net/david136796/article/details/49660735。@为你芯冻。
Google Chrome开源项目独立的Javascript编译引擎V8,V8在运行之前将JavaScript编译成了机器码,而非字节码或是直译它,以此提升性能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能...
关于V8设计的讲解,有助于理解和使用V8引擎,学习V8的设计。
配套“编译v8引擎”文章使用 chrome浏览器js解析引擎 node.js