最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS中異常拋出和處理方法圖文詳解

 更新時間:2022年11月12日 10:26:09   作者:亦黑迷失  
JavaScript和其他語言一樣,都擁有捕獲異常的機制,下面這篇文章主要給大家介紹了關(guān)于JS中異常拋出和處理的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下

拋出異常

在 js 中,有時候我們需要處理一些異?;蝈e誤。比如編寫的某個函數(shù)所接收的參數(shù)要求是 Number 類型的,如果在該函數(shù)被調(diào)用時傳入的是字符串,就需要發(fā)出提醒。此時我們可以使用 throw 語句來拋出個異常:

// 例 1
function fn(num) {
  if (typeof num !== 'number') throw '需傳入數(shù)字'
  console.log(num) // 不會打印
}

fn('0')
console.log('不會執(zhí)行')

執(zhí)行例 1 的代碼結(jié)果如下:

因為第 7 行傳入的是字符串,所以會導(dǎo)致第 3 行 throw 語句的執(zhí)行,那么在函數(shù) fn 內(nèi),之后的語句就不會執(zhí)行了,這點和 return 一樣。因為我們沒有對第 7 行的 fn 函數(shù)的執(zhí)行做異常捕獲的操作,所以程序終止,其后的第 8 行也不會執(zhí)行。

拋出的表達(dá)式類型

基本數(shù)據(jù)類型

例 1 中我們就是是拋出了一個基本數(shù)據(jù)類型 —— 字符串,當(dāng)然還可以是數(shù)字等其它基本類型的數(shù)據(jù)。

對象

我們也可以拋出一個對象,這樣可以傳遞更多的信息:

// 例 1.1
function fn(num) {
  if (typeof num !== 'number')
    throw {
      code: -1,
      msg: '類型錯誤'
    }
  console.log(num)
}

類的實例對象

如果每次拋出異常我們都像例 1.1 這樣寫個對象會比較繁瑣,所以可以創(chuàng)建一個類,比如例 1.2 的 myError,幫我們創(chuàng)建包含了錯誤信息的對象:

// 例 1.2
class myError {
  constructor(code, msg) {
    this.code = code
    this.msg = msg
  }
}
function fn(num) {
  if (typeof num !== 'number') throw new myError(-1, '類型錯誤')
  console.log(num)
}

這樣執(zhí)行 fn 時,如果不做異常捕獲就會打印如下的報錯信息:

Error 類的實例對象

事實上我們并不需要自己定義一個類來創(chuàng)建錯誤對象,js 本身就為我們提供了這么一個類 Error,構(gòu)建錯誤對象時傳入錯誤的描述信息即可:

// 例 1.3
function fn(num) {
  if (typeof num !== 'number') throw new Error('類型錯誤')
  console.log(num)
}

fn('0')

在 node 中執(zhí)行例 1.3,得到的結(jié)果會比我們自己定義的 myError多出函數(shù)的調(diào)用棧的信息:

我們可以直接通過 Error 實例對象的 stack 屬性查看調(diào)用棧,還有 messagename

// 例 1.3.1
function fn(num) {
  if (typeof num !== 'number') {
    const err = new Error('類型錯誤')
    console.log('name:', err.name)
    console.log('message:', err.message)
    console.log('stack:', err.stack)
    throw err
  }
  console.log(num)
}
fn('0')

在 node 中執(zhí)行例 1.3.1,第 5 ~ 7 的輸出結(jié)果如下:

如果我們對例 1.3 進(jìn)行些改造,不直接執(zhí)行 fn('0') 而是讓它在 bar 函數(shù)內(nèi)被調(diào)用,然后在 foo 函數(shù)內(nèi)調(diào)用 bar ,最后執(zhí)行 foo()

// 例 1.3.2
function fn(num) {
  if (typeof num !== 'number') throw new Error('類型錯誤')
  console.log(num)
}
function foo() {
  bar()
}
function bar() {
  fn('0')
}
foo()

就可以看到調(diào)用棧信息又多了 2 條:

Error 的子類

Error 還有幾個子類,比如上面的這些例子,因為屬于類型錯誤,所以可以用更具體的 TypeError 類來生成錯誤對象:

// 例 1.4
function fn(num) {
  if (typeof num !== 'number') throw new TypeError('類型錯誤')
  console.log(num)
}
fn('0')

另外還有諸如引用錯誤 ReferenceError 和語法錯誤 SyntaxError 等。

處理異常

若一個異常被拋出而最終沒有被捕獲,那么會導(dǎo)致程序的終止執(zhí)行。之所以加了“最終”兩個字,是因為如果函數(shù)執(zhí)行時拋出的異常沒有被處理,異常會傳遞給執(zhí)行了該函數(shù)的函數(shù)調(diào)用。以例 1.3.2 為例,第 10 行執(zhí)行 fn('0') 導(dǎo)致拋出了異常,我們又沒有在第 10 行對fn('0') 進(jìn)行異常捕獲,那么異常就會傳給第 7 行的 bar(),再傳給第 12 行,也就是最頂層的 foo(),此時還是沒有對異常進(jìn)行處理,才會導(dǎo)致報錯并終止程序的運行。 只要我們在異常傳遞過程中的任何一處用 try...catch 語句對異常進(jìn)行了捕獲,比如下面的例 2,那么程序就不會被終止,異常會作為參數(shù)傳遞給 catch 子句,也就是第 15 行的 error

// 例 2
function fn(num) {
  if (typeof num !== 'number') throw new Error('類型錯誤')
  console.log(num) // 不會執(zhí)行
}
function foo() {
  bar()
}
function bar() {
  fn('0')
}
try {
  foo()
  console.log('我不會繼續(xù)執(zhí)行')
} catch (error) {
  console.log('error:', error.message)
} finally {
  console.log('我無論是否有異常拋出都會執(zhí)行')
}
console.log('我會繼續(xù)執(zhí)行')

執(zhí)行例 2 的結(jié)果如下:

可以看到例 2 第 17 行還有個 finally 子句,無論是否有異常拋出或捕獲它總是執(zhí)行。

P.S. 從 ES10(ES2019)開始,第 15 行的 catch 子句可以省略掉 (error),也就是不去獲取錯誤信息。

js中常見的系統(tǒng)異常:

  • EvalError: raised when an error occurs executing code in eval()   當(dāng)一個錯誤發(fā)生在()執(zhí)行的代碼
  • RangeError: raised when a numeric variable or parameter is outside of its valid range  當(dāng)一個數(shù)值變量或參數(shù)超出其有效范圍時引發(fā)的
  • ReferenceError: raised when de-referencing an invalid reference  無效的飲用
  • SyntaxError: raised when a syntax error occurs while parsing code in eval()  當(dāng)發(fā)生語法錯誤在()解析代碼,而
  • TypeError: raised when a variable or parameter is not a valid type  當(dāng)一個變量或參數(shù)不是一個有效的類型時引發(fā)
  • URIError: raised when encodeURI() or decodeURI() are passed invalid parameters  當(dāng)encodeuri()或decodeuri()傳遞了無效的參數(shù)

注:上面的六種異常對象都繼承自Error對象: 

try {
  throw new Error("Whoops!");
} catch (e) {
  console.log(e.name + ": " + e.message);
}

總結(jié)

到此這篇關(guān)于JS中異常拋出和處理方法的文章就介紹到這了,更多相關(guān)JS異常拋出與處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS實現(xiàn)IE狀態(tài)欄文字縮放效果代碼

    JS實現(xiàn)IE狀態(tài)欄文字縮放效果代碼

    這篇文章主要介紹了JS實現(xiàn)IE狀態(tài)欄文字縮放效果代碼,涉及JavaScript針對瀏覽器的相關(guān)調(diào)用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • js實現(xiàn)省市級聯(lián)效果分享

    js實現(xiàn)省市級聯(lián)效果分享

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)省市級聯(lián)效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • JavaScript如何獲取和解析頁面內(nèi)容

    JavaScript如何獲取和解析頁面內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript實現(xiàn)獲取和解析頁面內(nèi)容,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2025-03-03
  • 將string解析為json的幾種方式小結(jié)

    將string解析為json的幾種方式小結(jié)

    將string解析為json的幾種方式小結(jié),需要的朋友可以參考下。
    2010-11-11
  • Bootstrap教程JS插件彈出框?qū)W習(xí)筆記分享

    Bootstrap教程JS插件彈出框?qū)W習(xí)筆記分享

    這篇文章主要為大家分享了Bootstrap教程JS插件彈出框?qū)W習(xí)筆記,為大家詳細(xì)介紹Bootstrap彈出框的使用方法,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 使用Fuse.js實現(xiàn)高效的模糊搜索功能

    使用Fuse.js實現(xiàn)高效的模糊搜索功能

    在現(xiàn)代?Web?應(yīng)用程序中,實現(xiàn)高效的搜索功能是至關(guān)重要的,Fuse.js?是一個強大的?JavaScript?庫,它提供了靈活的模糊搜索和文本匹配功能,使您能夠輕松實現(xiàn)出色的搜索體驗,文中代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • js中onclick和addEventListener的區(qū)別詳解

    js中onclick和addEventListener的區(qū)別詳解

    這篇文章深入探討了JavaScript中處理事件的兩種不同方法,即熟悉的onclick和多功能的addEventListener方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • Webpack中無法解析別名路徑的原因及解決方案

    Webpack中無法解析別名路徑的原因及解決方案

    在現(xiàn)代前端開發(fā)中,Webpack 是一個強大的模塊打包工具,廣泛應(yīng)用于各種項目中,為了簡化模塊導(dǎo)入路徑,開發(fā)者常常會在Webpack中配置別名路徑(alias),然而,在實際使用過程中,配置別名路徑可能會遇到“無法解析別名路徑”的問題,所以本文給大家介紹了詳細(xì)的解決方案
    2025-02-02
  • 深入理解JavaScript系列(8) S.O.L.I.D五大原則之里氏替換原則LSP

    深入理解JavaScript系列(8) S.O.L.I.D五大原則之里氏替換原則LSP

    本章我們要講解的是S.O.L.I.D五大原則JavaScript語言實現(xiàn)的第3篇,里氏替換原則LSP(The Liskov Substitution Principle )。
    2012-01-01
  • Js之如何移除Array/數(shù)組中指定元素

    Js之如何移除Array/數(shù)組中指定元素

    這篇文章主要介紹了Js之如何移除Array/數(shù)組中指定元素問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論

双鸭山市| 湄潭县| 潢川县| 彰武县| 富蕴县| 蒙城县| 汶上县| 甘孜| 铜川市| 峡江县| 九江县| 简阳市| 昂仁县| 重庆市| 固安县| 左权县| 子长县| 濮阳县| 巴彦县| 庐江县| 女性| 云林县| 保定市| 广水市| 商水县| 庄河市| 百色市| 襄汾县| 潜山县| 霸州市| 南丹县| 石屏县| 潜江市| 榕江县| 木里| 水城县| 平定县| 武冈市| 涪陵区| 嘉禾县| 建水县|