🎖️团队内,JavaScript常规错误处理技巧

简介: 在这篇文章中,我将分享一些我在错误处理和日志记录方面所学到的实用技巧和最佳实践,同时结合我的经验示例。如果当初我知道现在的这些知识,我肯定会从一开始就注重错误处理。

嗨,大家好!这里是道长王jj~ 🎩🧙‍♂️

在踏入社会工作的道路上,我积累了很多关于编程的技巧。今天,我特别高兴能深入研究那些我们常常忽略的方面:错误处理和日志记录。

在追求快速开发的过程中,我们可能会将所有代码搅合在一起,以确保项目运转。而我最初忽略的一点是实现强大的错误处理和日志记录系统。毕竟,当你可以通过代码来避免错误时,为什么要在错误上花费时间,对吗?然而,随着时间的推移,我深刻吸取了教训,因为我不得不在调试和故障排除上花费无数小时。

在这篇文章中,我将分享一些我在错误处理和日志记录方面所学到的实用技巧和最佳实践,同时结合我的经验示例。如果当初我知道现在的这些知识,我肯定会从一开始就注重错误处理。

为什么错误处理很重要?

在我们深入研究实用技巧之前,让我们先花点时间思考一下为什么错误处理如此重要。无论你是新手还是经验丰富的开发者,错误都是难以避免的。无论你多么小心,团队经验多丰富,或者你的 QA 流程多么完善,问题仍可能会发生。这就是软件开发的现实。

处理错误

如何在后端环境中高效处理错误?这个问题没有标准答案,因为它很大程度上取决于你的技术栈、团队规模、项目复杂性等多个因素。然而,有一些通用的最佳实践需要遵循。

集中式错误处理

最好尽可能地集中错误处理。这样的做法简化了代码的可读性和可维护性,并确保了处理的一致性。如果你使用像 Express.js 这样的框架,你可以使用中间件来实现这一点。

app.use((err, req, res, next) => {
   
  console.error(err.msg);
  res.status(500).send('出错了!');
});

这个错误处理中间件会捕获路由处理程序中发生的错误,并发送一个通用的响应。

但是,如果你想要发送更加用户友好的消息或处理不同类型的错误,该怎么办呢?

自定义错误类

JavaScript 中的自定义错误类允许你创建特定的错误类型,每个类型可能有自己的错误处理方式。以下是一个简单的示例:

class ValidationError extends Error {
   
  constructor(message) {
   
    super(message);
    this.name = "ValidationError";
    this.statusCode = 400;
  }
}

class DatabaseError extends Error {
   
  constructor(message) {
   
    super(message);
    this.name = "DatabaseError";
    this.statusCode = 500;
  }
}

通过使用这些类,你可以在代码中抛出特定类型的错误,错误处理中间件的行为可能会因错误类型而异。

app.use((err, req, res, next) => {
   
  if (err instanceof ValidationError) {
   
    res.status(err.statusCode).send(err.message);
  } else if (err instanceof DatabaseError) {
   
    res.status(err.statusCode).send('一个数据库错误');
  } else {
   
    res.status(500).send('出错了!');
  }
});

正确使用try/catch

最好的技巧就是,只捕获你能够处理的错误。如果你无法处理错误(例如,你不知道为什么发生错误),通常最好将它冒泡到全局错误处理程序中。

以下是 try/catch 块的一个很好示例:

try {
   
  const user = await getUserFromDb(userId);
} catch (err) {
   
  if (err instanceof NotFoundError) {
   
    //我们知道的错误可以针对性处理
    return createNewUser(userId);
  }
  // 我们不知道的错误就抛出全局处理
  throw err;
}

在这个示例中,我们只捕获我们知道可能发生且能够处理的特定错误。任何其他错误都会被重新抛出,可以由全局错误处理程序处理。

良好的日志记录

现在,错误处理是关于在错误发生时进行处理,而日志记录则是记录已发生事件,以便你以后可以回顾。这在调试过程中非常有用。

记录可能对调试有帮助的任何信息。这可以包括输入参数、输出结果和任何中间变量。但请注意隐私和安全问题,不要记录敏感信息如密码。

理想情况下,尽可能多地记录,但在详细信息和性能/存储之间需要权衡。请考虑使用不同的日志级别(错误、警告、信息、调试)来进行这种权衡。

对于本地开发,仅在控制台上记录可能已足够。但对于生产系统,你需要使用能够处理大量日志、执行保留政策并提供搜索和分析工具的日志服务。

以下是如何记录函数输入和输出的示例:

function add(a, b) {
   
  console.log(`输入参数:${a},${b}`);
  const result = a + b;
  console.log(`返回结果:${
     result}`);
  return result;
}

通过合理的错误处理和详尽的日志记录,你可以让编程变得更加从容。无论在开发还是维护阶段,都能让你更轻松地理解、定位并解决问题。记住,每个错误和日志记录都是让你更加成长的机会。加油!💪


🎉 你觉得怎么样?这篇文章可以给你带来帮助吗?当你处于这个阶段时,你发现什么对你帮助最大?如果你有任何疑问或者想进一步讨论相关话题,请随时发表评论分享您的想法,让其他人从中受益。🚀✨

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
7月前
|
缓存 JavaScript 前端开发
带你读《现代Javascript高级教程》二十、JavaScript修饰器:简化代码,增强功能(2)
带你读《现代Javascript高级教程》二十、JavaScript修饰器:简化代码,增强功能(2)
|
7月前
|
缓存 JavaScript 前端开发
带你读《现代Javascript高级教程》二十、JavaScript修饰器:简化代码,增强功能(1)
带你读《现代Javascript高级教程》二十、JavaScript修饰器:简化代码,增强功能(1)
|
7月前
|
JavaScript 前端开发 开发者
带你读《现代Javascript高级教程》二十、JavaScript修饰器:简化代码,增强功能(4)
带你读《现代Javascript高级教程》二十、JavaScript修饰器:简化代码,增强功能(4)
|
7月前
|
JavaScript 前端开发 索引
带你读《现代Javascript高级教程》二十、JavaScript修饰器:简化代码,增强功能(3)
带你读《现代Javascript高级教程》二十、JavaScript修饰器:简化代码,增强功能(3)
|
7月前
|
存储 前端开发 JavaScript
带你读《现代Javascript高级教程》二十七、实现符合Promise/A+规范的Promise(1)
带你读《现代Javascript高级教程》二十七、实现符合Promise/A+规范的Promise(1)
|
7月前
|
前端开发 JavaScript
带你读《现代Javascript高级教程》二十七、实现符合Promise/A+规范的Promise(2)
带你读《现代Javascript高级教程》二十七、实现符合Promise/A+规范的Promise(2)
|
7月前
|
前端开发 JavaScript
带你读《现代Javascript高级教程》二十七、实现符合Promise/A+规范的Promise(6)
带你读《现代Javascript高级教程》二十七、实现符合Promise/A+规范的Promise(6)
|
7月前
|
前端开发 JavaScript 测试技术
带你读《现代Javascript高级教程》二十七、实现符合Promise/A+规范的Promise(5)
带你读《现代Javascript高级教程》二十七、实现符合Promise/A+规范的Promise(5)
|
7月前
|
资源调度 前端开发 JavaScript
带你读《现代Javascript高级教程》二十七、实现符合Promise/A+规范的Promise(4)
带你读《现代Javascript高级教程》二十七、实现符合Promise/A+规范的Promise(4)
|
7月前
|
前端开发 JavaScript
带你读《现代Javascript高级教程》二十七、实现符合Promise/A+规范的Promise(3)
带你读《现代Javascript高级教程》二十七、实现符合Promise/A+规范的Promise(3)