<acronym id="indot"><dfn id="indot"></dfn></acronym>
<span id="indot"></span>

<bdo id="indot"><meter id="indot"></meter></bdo>
<label id="indot"><samp id="indot"></samp></label>
<label id="indot"><xmp id="indot">
  • <span id="indot"><table id="indot"></table></span>
    <center id="indot"><optgroup id="indot"></optgroup></center>
  • <bdo id="indot"><meter id="indot"></meter></bdo>
      當(dāng)前位置:首頁 > javascript > 正文內(nèi)容

      Javascript try catch的使用

      hxing6411年前 (2024-01-13)javascript4298

      說到 try...catch 都覺得非常熟悉了,不就是用來捕捉代碼塊中的錯(cuò)誤嘛,平時(shí)也用得比較多的。然而因?yàn)榱私獠粔蚨啵业拿嬖噮s栽在了一個(gè)簡(jiǎn)單的知識(shí)點(diǎn)上:try...catch 只能捕捉到同步執(zhí)行代碼塊中的錯(cuò)誤。 題目是:以下代碼有錯(cuò)嗎?如果有錯(cuò),應(yīng)該如何改正?

      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);
      }


      反正就是不知道咋回事,我之前的知識(shí)儲(chǔ)備中就是沒有這個(gè)知識(shí)點(diǎn):try...catch不能異步捕獲代碼錯(cuò)誤,因?yàn)樗旧砭褪且粋€(gè)同步代碼塊。所以看到這道題我就懵了,平時(shí)代碼不就是這樣寫的嗎,用try...catch來捕獲錯(cuò)誤,所以當(dāng)時(shí)就直接回了我不知道,感覺沒有啥錯(cuò)誤。。。,面試官無奈的看了我一眼,下來可以了解一下,然后就沒有然后了。


      下來我就趕緊查了資料,才知道try...catch不能異步捕獲代碼錯(cuò)誤。在 JavaScript 中,setTimeout 是一個(gè)異步函數(shù),它的回調(diào)函數(shù)會(huì)在指定的延時(shí)后被放入事件隊(duì)列,等待當(dāng)前執(zhí)行棧清空后才執(zhí)行。因此,當(dāng)setTimeout的回調(diào)函數(shù)執(zhí)行并拋出錯(cuò)誤時(shí),try...catch已經(jīng)執(zhí)行完畢,無法捕捉到異步回調(diào)中的錯(cuò)誤。


      正確的做法是在異步操作中直接處理錯(cuò)誤,例如使用回調(diào)函數(shù)、Promises 或者 async/await 結(jié)合 try...catch

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


      至于第二個(gè)例子,嘗試使用try...catch來捕捉一個(gè)在Promise鏈中拋出的錯(cuò)誤。這種方式同樣是無效的,因?yàn)閠ry...catch不能捕捉到在Promise鏈中的異步錯(cuò)誤。


      Promise 對(duì)象用于表示一個(gè)異步操作的最終完成(或失敗),及其結(jié)果值。一個(gè)Promise的狀態(tài)可能是以下幾種:

      Pending(等待態(tài)) :初始狀態(tài),既不是成功,也不是失敗狀態(tài)。

      Fulfilled(成功態(tài)) :意味著操作成功完成。

      Rejected(失敗態(tài)) :意味著操作失敗。

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

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



      掃描二維碼推送至手機(jī)訪問。

      版權(quán)聲明:本文由星星博客發(fā)布,如需轉(zhuǎn)載請(qǐng)注明出處。

      本文鏈接:http://www.7811333.com/?id=512

      “Javascript try catch的使用” 的相關(guān)文章

      JS中call aplly bind的區(qū)別

      call、apply、bind的作用是改變函數(shù)運(yùn)行時(shí)this的指向。1. call()的第一個(gè)參數(shù)為this綁定的對(duì)象,后面?zhèn)魅胍淮畢?shù)列表。當(dāng)?shù)谝粎?shù)為null或undefined時(shí),默認(rèn)指向window對(duì)象。2. apply()和call()類似,唯一的不同點(diǎn)在于第二個(gè)參數(shù)傳入一個(gè)參數(shù)數(shù)組。當(dāng)?shù)?..

      JavaScript中的call、bind和apply方法深度解析

      JavaScript是一種動(dòng)態(tài)的、強(qiáng)大的編程語言,它的靈活性源于其獨(dú)特的函數(shù)調(diào)用方式。在JavaScript中,我們常常會(huì)遇到三個(gè)非常重要的函數(shù)方法:call、bind和apply。這些方法都是用來改變函數(shù)運(yùn)行時(shí)this的指向的。理解它們的工作原理和使用場(chǎng)景,對(duì)于我們編寫高質(zhì)量的Java...

      7個(gè)Js async/await高級(jí)用法

      JavaScript的異步編程已經(jīng)從回調(diào)(Callback)演進(jìn)到Promise,再到如今廣泛使用的async/await語法。后者不僅讓異步代碼更加簡(jiǎn)潔,而且更貼近同步代碼的邏輯與結(jié)構(gòu),大大增強(qiáng)了代碼的可讀性與可維護(hù)性。在掌握了基礎(chǔ)用法之后,下面將介紹一些高級(jí)用法,以便充分利用async/awai...

      JS數(shù)組常用方法

      JS數(shù)組常用方法

      JS數(shù)組常用方法:1.數(shù)組的復(fù)制和填充批量復(fù)制方法 copyWithin(),以及填充數(shù)組方法fill()。這兩個(gè)方法的函數(shù)簽名類似,都需要指定既有數(shù)組實(shí)例上的一個(gè)范圍,包含開始索引,不包含結(jié)束索引。使用這個(gè)方法不會(huì)改變數(shù)組的大小。 1.1.fill()方法使用fill()方法可以向一個(gè)已...

      微信小程序如何下載外部文件

      小程序下載文件主要是通過轉(zhuǎn)發(fā)文件到聊天進(jìn)行轉(zhuǎn)存,以下為具體實(shí)現(xiàn)代碼,可以直接拿去用,傳入下載的url:const download = (url) => {   var that = this...

      typescript 中 omit 的理解

      在 TypeScript 中,Omit 是一種非常有用的工具類型,它可以用于創(chuàng)建一個(gè)新的類型,這個(gè)新類型是從現(xiàn)有類型中排除了指定的屬性后得到的。如果你想要處理一個(gè)對(duì)象但又不需要包含某些屬性,那么 Omit 可以幫助你快速地創(chuàng)建一個(gè)新的類型。 比如說,...

      發(fā)表評(píng)論

      訪客

      ◎歡迎參與討論,請(qǐng)?jiān)谶@里發(fā)表您的看法和觀點(diǎn)。
      主站蜘蛛池模板: 亚洲色欲久久久久综合网| 精品久久综合一区二区| 国产亚洲精品第一综合| 无码综合天天久久综合网| 亚洲精品国产综合久久一线| 伊人一伊人色综合网| 色噜噜狠狠狠综合曰曰曰| 亚洲综合久久综合激情久久| 伊人久久大香线蕉综合5g| 天天综合网色中文字幕| 狠狠色综合久色aⅴ网站| 色婷婷五月综合欧美图片| 久久久久综合网久久| 亚洲综合另类小说色区色噜噜| 亚洲国产精品综合一区在线| 香蕉久久综合精品首页| 天天色天天射综合网| 色青青草原桃花久久综合| 99久久综合狠狠综合久久aⅴ| 亚洲精品第一国产综合境外资源| 狠狠夜色午夜久久综合热91| 亚洲综合一区二区精品久久| 久久青青草原综合伊人| 伊人久久青草青青综合| 综合久久一区二区三区| 久久综合久久久久| 97久久国产综合精品女不卡| 丁香色欲久久久久久综合网| 97久久婷婷五月综合色d啪蜜芽| 丁香婷婷色五月激情综合深爱 | 久久狠狠色狠狠色综合| 亚洲伊人久久综合影院| 伊人狠狠色丁香综合尤物| 综合人妻久久一区二区精品| 国产AV综合影院| 狠狠色丁香久久婷婷综合图片| 国产成人综合在线观看网站| 香蕉尹人综合在线观看| 一本久道久久综合狠狠躁AV| 伊人久久大香线焦AV综合影院 | 亚洲色欲啪啪久久WWW综合网|