JavaScript異常處理方式是什么

這篇文章主要介紹“JavaScript異常處理方式是什么”,在日常操作中,相信很多人在JavaScript異常處理方式是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JavaScript異常處理方式是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

10年積累的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有漢陽免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

JavaScript異常處理方式是什么

錯(cuò)誤是編程過程的一部分。編寫程序的過程難免會(huì)出現(xiàn)一些錯(cuò)誤,通過這些產(chǎn)生的錯(cuò)誤,我們可以學(xué)會(huì)如何避免遇到這樣的情況,以及如何在下次做的更好。

在 JavaScript 中,當(dāng)代碼語句緊密耦合并產(chǎn)生錯(cuò)誤時(shí),繼續(xù)使用剩余的代碼語句是沒有意義的。相反,我們試圖盡可能優(yōu)雅地從錯(cuò)誤中恢復(fù)過來。JavaScript 解釋器在出現(xiàn)此類錯(cuò)誤時(shí)檢查異常處理代碼,如果沒有異常處理程序,程序?qū)⒎祷貙?dǎo)致錯(cuò)誤的任何函數(shù)。

對調(diào)用堆棧上的每個(gè)函數(shù)重復(fù)此操作,直到找到異常處理程序或到達(dá)頂層函數(shù),從而導(dǎo)致程序以錯(cuò)誤終止,導(dǎo)致程序的崩潰。

一般來說,有兩種處理方式:

  • 拋出異常— 如果在運(yùn)行時(shí)發(fā)生的問題無法得到有意義的處理,最好拋出它

function openFile(fileName) {
  if (!exists(fileName)) {
    throw new Error('找不到文件 ' + fileName)
  }
  // ...
}
  • 捕獲異常— 拋出的異常在運(yùn)行時(shí)更有意義的地方被捕獲和處理

try {
  openFile('../test.js')
} catch(e) {
  // 優(yōu)雅地處理拋出的期望
}

讓我們更詳細(xì)地了解這些操作。

拋出異常

您可能會(huì)看到類似 ReferenceError: specs is not defined 這樣的情況。這表示通過 throw 語句引發(fā)的異常。

語法

throw ?value?
// 不要這樣做
if (somethingBadHappened) {
  throw 'Something bad happened'
}

對可以作為異常拋出的數(shù)據(jù)類型沒有限制,但 JavaScript 具有特殊的內(nèi)置異常類型。其中之一是 Error,正如您在前面的示例中所看到的。這些內(nèi)置的異常類型為我們提供了比異常消息更多的細(xì)節(jié)。

Error

Error 類型用于表示一般異常。這種類型的異常最常用于實(shí)現(xiàn)用戶定義的異常。它有兩個(gè)內(nèi)置屬性可供使用。

  • message — 作為參數(shù)傳遞給 Error 構(gòu)造函數(shù)的內(nèi)容。例如,new Error('This is an error message')。您可以通過 message 屬性訪問消息。

const myError = new Error('Error!!!')
console.log(myError.message) // Error!!!
  • stack — 該屬性返回導(dǎo)致錯(cuò)誤的文件的歷史記錄(調(diào)用堆棧)。堆棧頂部還包括 message,后面是實(shí)際堆棧,從最新/隔離的錯(cuò)誤點(diǎn)開始,到最外部負(fù)責(zé)的文件。

Error: Error!!!
    at <anonymous>:1:1

注意:new Error('...') 在拋出之前不會(huì)執(zhí)行任何操作,即 throw new Error('error msg') ?將在 JavaScript 中創(chuàng)建一個(gè) Error 實(shí)例,并停止腳本的執(zhí)行,除非您對 Error 錯(cuò)誤執(zhí)行某些操作,例如捕獲它。

捕捉異常

現(xiàn)在我們知道了什么是異常以及如何拋出它們,讓我們討論一下如何通過捕獲它們來阻止它們破壞我們的程序。

try-catch-finally 是處理異常的最簡單方法。

try {
  // 要運(yùn)行的代碼
} catch (e) {
  // 發(fā)生異常時(shí)要運(yùn)行的代碼
}
  
[ // 可選
  finally {
    // 無論發(fā)生異常都始終執(zhí)行的代碼
  }
]

在 try 子句中,我們添加了可能產(chǎn)生異常的代碼。如果發(fā)生異常,則執(zhí)行 catch 子句。

有時(shí),無論代碼是否產(chǎn)生異常,都需要執(zhí)行代碼,這時(shí)我們可以使用可選塊 finally。

即使 try 或 catch 子句執(zhí)行 return 語句,finally 塊也將執(zhí)行。例如,以下函數(shù)返回 'Execute finally',因?yàn)?finally 子句是最后執(zhí)行的內(nèi)容。

function foo() {
  try {
    return true
  } finally {
    console.log('Execute finally')
  }
}

我們在無法事先檢查代碼正確性的地方使用 try-catch。

const user = '{"name": "D.O", "age": 18}'
try {
  // 代碼運(yùn)行
  JSON.parse(params)
  // 在出現(xiàn)錯(cuò)誤的情況下,其余的代碼將永遠(yuǎn)無法運(yùn)行
  console.log(params)
} catch (err) {
  // 在異常情況下運(yùn)行的代碼
  console.log(err.message) // params is not defined
}

如上所示,在執(zhí)行代碼之前,不可能檢查 JSON.parse 以獲得 stringify 對象或字符串。

注意:您可以捕獲程序產(chǎn)生的異常和運(yùn)行時(shí)異常,但無法捕獲 JavaScript 語法錯(cuò)誤。

try-catch-finally 只能捕獲同步錯(cuò)誤。如果我們嘗試將其用于異步代碼,那么在異步代碼完成其執(zhí)行之前,try-catch-finally 可能已經(jīng)執(zhí)行了。

如何處理異步代碼塊中的異常

回調(diào)函數(shù)

使用回調(diào)函數(shù)(不推薦),我們通常會(huì)收到兩個(gè)如下所示的參數(shù):

async function(code, (err, result) => {
  if (err) return console.error(err)
  console.log(result)
})

我們可以看到有兩個(gè)參數(shù):err 和 result。如果有錯(cuò)誤,err 參數(shù)將等于該錯(cuò)誤,我們可以拋出該錯(cuò)誤來進(jìn)行異常處理。

在 if (err) 塊中返回某些內(nèi)容或?qū)⑵渌噶畎b在 else 塊中都很重要。否則,您可能會(huì)遇到另一個(gè)錯(cuò)誤。例如,當(dāng)您嘗試訪問 result.data 時(shí),result 可能未定義。

Promises

使用 promises 的 then 或者 catch,我們可以通過將錯(cuò)誤處理程序傳遞給 then 方法或使用 catch 子句來處理錯(cuò)誤。

promise.then(onFulfilled, onRejected)

也可以使用 .catch(onRejected) 而不是 .then(null, onRejected) 添加錯(cuò)誤處理程序,其工作方式相同。

讓我們看一個(gè) .catch 拒絕 Promise 的例子。

Promise.resolve('1')
  .then(res => {
    console.log(res) // 1
    throw new Error('go wrong') // 拋出異常
})
.then(res => {
  console.log(res) // 不會(huì)被執(zhí)行
})
.catch(err => { 
  console.error(err) // 捕獲并處理異常 ——> Error: go wrong
})

使用 async/await 和 try-catch

使用 async/await 和 try-catch-finally,處理異常是輕而易舉的事。

async function func() {
  try {
    await nonExistentFunction()
  } catch (err) {
    console.error(err) // ReferenceError: nonExistentFunction is not defined 
  }
}

如何處理未捕獲的異常

現(xiàn)在我們已經(jīng)很好地理解了如何在同步和異步代碼塊中執(zhí)行異常處理,讓我們回答本文最后一個(gè)待解決的問題?:我們?nèi)绾翁幚砦床东@的異常?

在瀏覽器中

我們可以使用 window.onerror() 方法來處理未捕獲的異常。每當(dāng)運(yùn)行時(shí)發(fā)生錯(cuò)誤時(shí),該方法會(huì)在 window 對象上觸發(fā) error 事件。

onerror() 的另一個(gè)實(shí)用做法是:當(dāng)站點(diǎn)中的圖片或視頻等數(shù)據(jù)加載出錯(cuò)時(shí),可以用該方法觸發(fā)某些操作。例如,提供一張加載出錯(cuò)時(shí)的圖片,或顯示一條消息。

<img src="logo.png" onerror="alert('Error loading picture.')" />

在 Node.js 中

EventEmitter 模塊派生的 process 對象可以訂閱事件 uncaughtException。

process.on('uncaughtException', () => {})`

我們可以傳遞一個(gè)回調(diào)來處理異常。如果我們嘗試捕獲這個(gè)未捕獲的異常,進(jìn)程將不會(huì)終止,因此我們必須手動(dòng)完成。

uncaughtException 僅適用于同步代碼。對于異步代碼,還有另一個(gè)稱為 unhandledRejection 的事件。

process.on('unhandledRejection', () => {})

決不要嘗試為基本 Error 類型實(shí)現(xiàn) “捕獲所有” 處理程序。這將混淆所發(fā)生的一切,并損害代碼的可維護(hù)性和可擴(kuò)展性。

關(guān)鍵要點(diǎn)

throw 語句用于生成用戶定義的異常。在運(yùn)行時(shí),當(dāng) throw 遇到語句時(shí),當(dāng)前函數(shù)的執(zhí)行將停止,控制權(quán)將傳遞給 catch 調(diào)用堆棧中的第一個(gè)子句。如果沒有 catch 子句,程序?qū)⒔K止

JavaScript 有一些內(nèi)置的異常類型,最值得注意的是 Error,它返回 Error 中的兩個(gè)重要屬性:stack 和 message。

try 子句將包含可能產(chǎn)生異常的代碼,catch 子句會(huì)在發(fā)生異常時(shí)執(zhí)行。

對于異步代碼,最好使用 async/await 配合 try-catch 語句。

可以捕獲未處理的異常,這可以防止應(yīng)用程序崩潰。

不要覺得麻煩,異常處理可以幫助您提高代碼的可維護(hù)性、可擴(kuò)展性和可讀性。

到此,關(guān)于“JavaScript異常處理方式是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

本文名稱:JavaScript異常處理方式是什么
轉(zhuǎn)載來源:http://muchs.cn/article16/gpphgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站改版建站公司、移動(dòng)網(wǎng)站建設(shè)微信小程序、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)