記錄--try...catch知識補全

来源:https://www.cnblogs.com/smileZAZ/archive/2023/12/27/17931181.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 說到try...catch都覺得非常熟悉了,不就是用來捕捉代碼塊中的錯誤嘛,平時也用得比較多的。然而因為瞭解不夠多,我的面試卻栽在了一個簡單的知識點上:try...catch只能捕捉到同步執行代碼塊中的錯誤。 題目是:以下代碼有錯嗎?如果 ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

說到try...catch都覺得非常熟悉了,不就是用來捕捉代碼塊中的錯誤嘛,平時也用得比較多的。然而因為瞭解不夠多,我的面試卻栽在了一個簡單的知識點上:try...catch只能捕捉到同步執行代碼塊中的錯誤。 題目是:以下代碼有錯嗎?如果有錯,應該如何改正?
try {
  setTimeout(() => {
    throw new Error('err')
  }, 200);
} catch (err) {
  console.log(err);
}

try {
  Promise.resolve().then(() => {
    throw new Error('err')
  })
} catch (err) {
  console.log(err);
}

反正就是不知道咋回事,我之前的知識儲備中就是沒有這個知識點:try...catch不能非同步捕獲代碼錯誤,因為它本身就是一個同步代碼塊。所以看到這道題我就懵了,平時代碼不就是這樣寫的嗎,用try...catch來捕獲錯誤,所以當時就直接回了我不知道,感覺沒有啥錯誤。。。,面試官無奈的看了我一眼,下來可以瞭解一下,然後就沒有然後了。

下來我就趕緊查了資料,才知道try...catch不能非同步捕獲代碼錯誤。在JavaScript中,setTimeout是一個非同步函數,它的回調函數會在指定的延時後被放入事件隊列,等待當前執行棧清空後才執行。因此,當setTimeout的回調函數執行並拋出錯誤時,try...catch已經執行完畢,無法捕捉到非同步回調中的錯誤。

正確的做法是在非同步操作中直接處理錯誤,例如使用回調函數、Promises或者async/await結合try...catch

new Promise((resolve, reject) => {
  setTimeout(() => {
    try {
      throw new Error('err');
    } catch (err) {
      reject(err);
    }
  }, 200);
})
  .then(() => {
    // 正常執行時的處理邏輯
  })
  .catch((err) => {
    console.log(err); // 這裡會捕捉到錯誤
  });

至於第二個例子,嘗試使用try...catch來捕捉一個在Promise鏈中拋出的錯誤。這種方式同樣是無效的,因為try...catch不能捕捉到在Promise鏈中的非同步錯誤。

Promise對象用於表示一個非同步操作的最終完成(或失敗),及其結果值。一個Promise的狀態可能是以下幾種:

  • Pending(等待態) :初始狀態,既不是成功,也不是失敗狀態。
  • Fulfilled(成功態) :意味著操作成功完成。
  • Rejected(失敗態) :意味著操作失敗。

在Promise中拋出一個錯誤(例如通過throw語句)會導致Promise被拒絕(或失敗)。要正確處理這個錯誤,需要在Promise鏈中使用.catch方法或者在一個async函數中使用try...catch

// 方法一
Promise.resolve()
  .then(() => {
    throw new Error('err');
  })
  .catch((err) => {
    console.log(err); // 這裡會捕捉到錯誤
  });

// 方法二
async function handleError() {
  try {
    await Promise.resolve().then(() => {
      throw new Error('err');
    });
  } catch (err) {
    console.log(err); // 這裡會捕捉到錯誤
  }
}

handleError();

本文轉載於:

https://juejin.cn/post/7316539952475619362

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前有和大家分享過 支付寶非同步通知如何使用的相關內容,但是有些時候吧,就是收不到非同步通知,也不知道是什麼原因導致的。 今天來幫大家彙總下在「收不到非同步通知」的情況下,如何排查問題出現在哪裡。 ...
  • 在C/C++中使用WMI(Windows Management Instrumentation)介面查詢系統信息是一種強大的方法。下麵是一個簡單的例子,演示如何使用WMI查詢系統信息,包括安裝的軟體信息、磁碟信息、網路適配器信息、操作系統信息等。請註意,這裡使用的是COM介面,因此需要在代碼中進行C ...
  • 什麼是Json Schema ? Json schema是一種聲明式語言,它可以用來標識Json的結構,數據類型和數據的具體限制,它提供了描述期望Json結構的標準化方法。 利用Json Schema, 你可以定義Json結構的各種規則,以便確定Json數據在各個子系統中交互傳輸時保持相容和一致的格 ...
  • 從昨天發表的《碼農的轉型之路-多年以來的反思》收到了不少猿友的評論和關註,還有幾個加了wx,給了很多正面的反饋。趁著熱度還在:) 也有很多人不知道這個人要幹嘛,索性今天正式介紹一下,但名字還沒有想好,她應該是一款瀏覽器工具。 一、什麼應用場景?1.C/S開發 大概是7年前當時公司接了一個區域品牌羊肉 ...
  • 關係型資料庫的特點 二維表 典型產品Oracle傳統企業,MySQL是互聯網企業 數據存取是通過SQL 最大特點,數據安全性方面強(ACID) • NoSQL:非關係型資料庫(Not only SQL) 不是否定關係型資料庫,做關係型資料庫的的補充 想做老大,先學會做老二 • NoSQL特性總覽 – ...
  • 表單是B端產品中最常見的組件之一,主要⽤於數據收集、校驗和提交。比如登陸流程的賬號密碼填寫,註冊流程的郵箱、用戶名等信息填寫,都是表單應用的常見案例,在數棧產品中也是出現頻率⾮常⾼的組件。 儘管表單應用十分普遍,但在我們對舊版數棧產品進行調研時,發現許多產品同學都反饋了關於表單的問題。所以在實際設計 ...
  • 官答|初始化GreatSQL報錯無法找到數據目錄或初始化數據字典失敗 GreatSQL推出新欄目——官答 官答欄目針對GreatSQL資料庫中的問題,選取官方論壇和討論群中的典型提問進行深入解答。內容涵蓋資料庫安裝部署、配置優化、故障排查、性能測試等方面。 在文章中,我們不僅提供解決方案,還會結合實 ...
  • 前言 經過上一篇文章的介紹,已經將這個計算器的計算功能實現了,接下來就是我們項目當中的一個發包上線階段,我模擬一下,目的就是為了給大家介紹一下,uni-app是如何打包成網頁的。 除了可以打包成網頁,uni-app還可以打包成小程式、App、H5、快應用等等,後面在單獨開文章詳細介紹。 正文 接著上 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...