調用棧的工作機制
在討論JS中的錯誤之前,我們必須了解CallStack的工作機制。其實這個機制很簡單。如果妳清楚這壹點,可以直接跳過這壹部分。
簡單來說就是:當壹個函數被調用時,它會被添加到調用棧頂,執行後,它會被從調用棧頂移除。這種數據結構的關鍵是LIFO,也就是大家熟知的LIFO。比如我們在函數Y內部調用函數X時,從下到上調用棧的順序是Y->;十.
錯誤對象和錯誤處理
當代碼中出現錯誤時,我們通常會拋出壹個錯誤對象。Error對象可以用作擴展和創建自定義錯誤類型的原型。錯誤對象的原型具有以下屬性:
Constructor_負責這個實例的原型構造函數;
Message_ error消息;
Name_錯誤的名稱;
以上都是標準屬性,有些JS運行時環境也提供了標準屬性之外的屬性,比如Node.js、Firefox、Chrome、Edge、IE10、Opera、Safari6+,都包含了錯誤代碼的調用棧,我們將簡稱為錯誤棧。錯誤堆棧包含發生錯誤時的完整調用堆棧信息。如果您想了解更多關於Error對象的非標準屬性,我強烈建議您閱讀MDN的這篇文章。
在拋出錯誤時,必須使用throw關鍵字。為了捕獲拋出的錯誤,必須使用trycatch語句包裝可能錯誤的代碼塊。在捕捉時,您可以接收壹個參數,這是拋出的錯誤。和Java類似,JS在trycatch語句後面也可以有finally,無論前面的代碼是否拋出錯誤,finally中的代碼都會被執行。這種語言的常見用法是:在最後做壹些清潔工作。
錯誤堆棧的剪裁
只有Node.js支持這個特性,通過error.capturestacktrace實現,Error.captureStackTrace接收壹個對象作為1個參數,壹個可選函數作為2個參數。IT training/認為它的作用是捕獲當前調用棧並剪切它。被捕獲的調用棧會用1個參數記錄在stack屬性上,切割的參考點是2個參數,也就是這個函數之前的調用會被記錄在調用棧上,後續的調用不會。