js直譯器v8引擎嵌入的異常處理
2023年08月10日
v8引擎為google開發的js語言直譯器有著高效易用等特點,通常它執行乙個js指令碼需要經過編譯和執行步驟,
由於我們的指令碼程式很可能不正確,隨時造成過程環節的異常,我們來解決乙個異常以及錯誤的捕捉和處理過程,如下指令碼:
test.js: 使用以下經典的v8 c++示例**來執行指令碼: #include
usingnamespace v8;
//提取js檔案
v8::handle::string> readfile(constchar* name)
int main()
然後編譯程式
# 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)
else else
returntrue;
} }
} return*value ?*value : "";
} void reportexception(v8::trycatch* try_catch) else
} }
int main(int argc, char* argv)
重新編譯後執行結果為:
# ./test
test.js:3: referenceerror: alert is not defined
alert(str);
^ referenceerror: alert is not defined
at test.js:3:1
已經可以正常報告錯誤。
JS中V8引擎簡介
document 2020 09 29 v8引擎 認識v8 v8 策略 v8常用的gc演算法 新生代物件的垃圾 將新生代記憶體也分成兩個大小相等的空間 使用空間為from,空閒空間為to 活動物件儲存於from空間中 to一直是空閒的 當from空間應用到一定程度之後 觸發gc操作 標記整理後將活動...
v8引擎和v12引擎 深入V8引擎 AST 2
先宣告一下,這種長系列的大塊頭部落格只能保證盡可能的深入到每一行原始碼,有些 我不樂意深究就寫個注釋說明一下作用。另外,由於本地整理的比較好,部落格就隨心寫了。bool parseprogram parseinfo info,isolate isolate 所需要關心的核心 就是這些,非常簡單,pa...
Mac OS下V8引擎編譯方法
v8 的github位址 因為需要訪問到google的伺服器,所以下面做的一切都需要翻到牆外面。翻牆方法自行解決吧。v8的版本控制是有乙個叫depot tools的工具維護的,這個東西相當於的將git包了一層。具體安裝方法 mac 下編輯 bash profile檔案,在檔案最開頭新增下列 其中 u...