Deno篇八|ES Module實現原理和異常捕獲

大綱

  • Deno內部異常處理
  • Deno模塊機制,import實現

Deno內部異常處理

Deno中異常處理主要分為三步,如圖1。

  1. 捕獲V8異常
  2. 解析異常信息
  3. 打印異常信息
Deno篇八|ES Module實現原理和異常捕獲

圖1 Deno內部異常處理流程


捕獲異常

之前的幾篇文章中已經分析過,Deno內部嵌入了V8引擎去執行JavaScript代碼,那麼當V8執行JavaScript代碼出現異常是如何捕獲的呢?

當然是依靠V8引擎自身提供的機制,熟悉V8引擎的同學應該清楚,V8暴露了TryCatch API。通過該API,可以捕獲到V8編譯和執行異常。在Deno中,對V8的TryCatch API進行了封裝。具體代碼2.


Deno篇八|ES Module實現原理和異常捕獲

圖2 Deno封裝V8 TryCatch API

處理封裝異常信息

捕獲到V8異常後,可以通過圖3中的代碼獲取V8拋出的異常,然後對異常信息進行處理。

Deno篇八|ES Module實現原理和異常捕獲

圖3 獲取V8異常

圖4為Rust異常信息對象,從V8獲取到異常信息之後,會解析異常信息,然後封裝成Rust對象。

Deno篇八|ES Module實現原理和異常捕獲

圖4 Rust異常信息對象


打印異常信息

Deno後端會把Rust異常對象序列化,然後打印在命令行,形式如圖5。

Deno篇八|ES Module實現原理和異常捕獲

圖5 異常信息顯示

Deno模塊機制,import實現

<code>import { serve } from "https://deno.land/[email protected]/http/server.ts";/<code>

如上,當V8引擎執行代碼時遇到import關鍵字,會去調用SetHostImportModuleDynamicallyCallback方法指定的回調函數。SetHostImportModuleDynamicallyCallback方法代碼如圖6,該方法是V8引擎自帶的一個方法,可以用來自定義import關鍵字的行為。


Deno篇八|ES Module實現原理和異常捕獲

圖6 v8 SetHostImportModuleDynamicallyCallback方法

在Deno初始化時,會去執行SetHostImportModuleDynamicallyCallback方法,為import關鍵字指定需要執行的回調函數。

<code>isolate.set_host_import_module_dynamically_callback(
bindings::host_import_module_dynamically_callback,
);/<code>

bindings::host_import_module_dynamically_callback方法是Deno中通過Rust實現的,用來加載對應的模塊,然後返回給V8執行。

到此,Deno內部異常處理,以及Import模塊實現原理分析完成。


分享到:


相關文章: