Js直譯器V8引擎嵌入的異常處理

2021-08-26 15:33:01 字數 1324 閱讀 4337

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