LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

再见 Try/Catch,在 TypeScript 中更优雅地处理错误

admin
2025年1月26日 23:15 本文热度 143

前言

大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!

用“错误捕获”替代 Try/Catch:TypeScript 错误处理新思路

在开发 TypeScript 应用程序时,你是否觉得传统的 Try/Catch 错误处理方式有些繁琐?最近,我在 YouTube 上看到一个有趣的视频,介绍了一种更简洁的错误处理方法。今天,我将分享视频中的核心内容,并结合自己的理解进行总结。

定义 getUser 函数用于错误处理

首先,我们定义一个简单的 getUser 函数来演示错误处理。该函数根据给定的 id 返回一个用户对象。

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 进行错误处理

将上述代码改写为使用 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 的问题 ①:捕获了 try 块内的所有错误

以下代码存在问题。即使只是一个拼写错误,控制台也会显示“There was an error”,而我只想捕获 getUser 中发生的错误。

const wait = (duration: number) => {

  ...

};


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

  ...

};


try {

  const user = await getUser(1);

  console.log(usr); // ← 拼写错误

  // ... (大量代码)

} catch (error) {

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

}

try/catch 的问题 ②:使用 let 的陷阱

尝试使用 let 解决问题,代码如下:

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

虽然拼写错误引发了实际错误,但这段代码仍不理想,因为可能会意外重新定义 user 对象,例如:

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; // ← ❌ 可能引发错误

解决方案

使用 catchError 函数可以更简洁、更易读地处理错误。此外,user 变量是不可变的,不会引发意外错误。

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

如果你对这种模式是否实用有疑问,可以参考视频中的详细解释。


作者:倔强青铜三
链接:https://juejin.cn/post/7464607408708468790
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

该文章在 2025/2/5 17:00:15 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved