超碰人人人人人,亚洲AV午夜福利精品一区二区,亚洲欧美综合区丁香五月1区,日韩欧美亚洲系列

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

再見(jiàn) Try/Catch,在 TypeScript 中更優(yōu)雅地處理錯(cuò)誤

admin
2025年1月26日 23:15 本文熱度 25

前言

大家好,我是倔強(qiáng)青銅三。是一名熱情的軟件工程師,我熱衷于分享和傳播IT技術(shù),致力于通過(guò)我的知識(shí)和技能推動(dòng)技術(shù)交流與創(chuàng)新,歡迎關(guān)注我,微信公眾號(hào):倔強(qiáng)青銅三。歡迎點(diǎn)贊、收藏、關(guān)注,一鍵三連!?。?/p>

用“錯(cuò)誤捕獲”替代 Try/Catch:TypeScript 錯(cuò)誤處理新思路

在開(kāi)發(fā) TypeScript 應(yīng)用程序時(shí),你是否覺(jué)得傳統(tǒng)的 Try/Catch 錯(cuò)誤處理方式有些繁瑣?最近,我在 YouTube 上看到一個(gè)有趣的視頻,介紹了一種更簡(jiǎn)潔的錯(cuò)誤處理方法。今天,我將分享視頻中的核心內(nèi)容,并結(jié)合自己的理解進(jìn)行總結(jié)。

定義 getUser 函數(shù)用于錯(cuò)誤處理

首先,我們定義一個(gè)簡(jiǎn)單的 getUser 函數(shù)來(lái)演示錯(cuò)誤處理。該函數(shù)根據(jù)給定的 id 返回一個(gè)用戶對(duì)象。

const wait = (duration: number) => {

  return new Promise((resolve) => {

    setTimeout(resolve, duration);

  });

};


const getUser = async (id: number) => {

  await wait(1000);


  if (id === 2) {

    throw new Error("404 - User does not exist");

  }


  return { id, name: "Noah" };

};


const user = await getUser(1);


console.log(user); // { id: 1, name: "Noah" }

使用 try/catch 進(jìn)行錯(cuò)誤處理

將上述代碼改寫為使用 try/catch 的形式,代碼如下:

const wait = (duration: number) => {

  ...

};


const getUser = async (id: number) => {

  ...

};


try {

  const user = await getUser(1);

  console.log(user); // { id: 1, name: "Noah" }

} catch (error) {

  console.log("There was an error");

}

try/catch 的問(wèn)題 ①:捕獲了 try 塊內(nèi)的所有錯(cuò)誤

以下代碼存在問(wèn)題。即使只是一個(gè)拼寫錯(cuò)誤,控制臺(tái)也會(huì)顯示“There was an error”,而我只想捕獲 getUser 中發(fā)生的錯(cuò)誤。

const wait = (duration: number) => {

  ...

};


const getUser = async (id: number) => {

  ...

};


try {

  const user = await getUser(1);

  console.log(usr); // ← 拼寫錯(cuò)誤

  // ... (大量代碼)

} catch (error) {

  console.log("There was an error");

}

try/catch 的問(wèn)題 ②:使用 let 的陷阱

嘗試使用 let 解決問(wèn)題,代碼如下:

const wait = (duration: number) => {

  ...

};


const getUser = async (id: number) => {

  ...

};


let user;


try {

  user = await getUser(1);

  // ... (大量代碼)

} catch (error) {

  console.log("There was an error");

}


console.log(usr); // ← ReferenceError: Can't find variable: usr

雖然拼寫錯(cuò)誤引發(fā)了實(shí)際錯(cuò)誤,但這段代碼仍不理想,因?yàn)榭赡軙?huì)意外重新定義 user 對(duì)象,例如:

const wait = (duration: number) => {

  ...

};


const getUser = async (id: number) => {

  ...

};


let user;


try {

  user = await getUser(1);

  // ... (大量代碼)

} catch (error) {

  console.log("There was an error");

}


user = 1; // ← ? 可能引發(fā)錯(cuò)誤

解決方案

使用 catchError 函數(shù)可以更簡(jiǎn)潔、更易讀地處理錯(cuò)誤。此外,user 變量是不可變的,不會(huì)引發(fā)意外錯(cuò)誤。

const wait = (duration: number) => {

  ...

};


const getUser = async (id: number) => {

  ...

};


const catchError = async <T>(promise: Promise<T>): Promise<[undefined, T] | [Error]> => {

  return promise

    .then((data) => {

      return [undefined, data] as [undefined, T];

    })

    .catch((error) => {

      return [error];

    });

};


const [error, user] = await catchError(getUser(1));


if (error) {

  console.log(error);

}


console.log(user);

如果你對(duì)這種模式是否實(shí)用有疑問(wèn),可以參考視頻中的詳細(xì)解釋。


作者:倔強(qiáng)青銅三
鏈接:https://juejin.cn/post/7464607408708468790
來(lái)源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

該文章在 2025/2/5 17:00:15 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved