【Node.js从基础到高级运用】十九、Node.js 捕获错误之“未捕获的异常”

news/2024/7/7 21:33:45

引言

在 Node.js 应用程序中,错误处理是保证应用稳定性和可靠性的关键部分。特别是“未捕获的异常”(uncaught exceptions),如果不妥善处理,很可能会导致整个进程崩溃。在本文中,我们将探讨如何在 Node.js 中捕获和处理未捕获的异常,并使用 Jest 框架进行测试。

什么是“未捕获的异常”?

在 Node.js 中,当一个异常没有被 try/catch 语句捕获时,它就会成为一个“未捕获的异常”。默认情况下,Node.js 会打印出错误信息,并退出当前进程。

如何捕获“未捕获的异常”?

为了防止进程因为未捕获的异常而退出,我们可以监听 process 对象的 uncaughtException 事件。

process.on('uncaughtException', (error) => {
  // 打印错误信息
  console.error('捕获到未处理的异常:', error);
  // 执行必要的清理操作
  // ...
  // 在完成清理后,可以选择退出进程
  process.exit(1);
});

示例代码

下面是一个简单的 Node.js 应用程序,它演示了如何捕获未捕获的异常:

// 引入 fs 模块用于文件操作
const fs = require('fs');

// 监听未捕获的异常
process.on('uncaughtException', (error) => {
  console.error('捕获到未处理的异常:', error);
  // 清理工作可以在这里进行
  process.exit(1); // 退出进程
});

// 一个会产生未捕获异常的函数
function readFileAsync() {
  // 异步读取一个不存在的文件,将会产生异常
  fs.readFile('/path/to/nonexistent/file', (err, data) => {
    if (err) {
      // 这里故意不处理错误,导致未捕获的异常
      throw err;
    }
    console.log(data);
  });
}

// 调用函数,产生未捕获的异常
readFileAsync();

在上面的代码中,readFileAsync 函数尝试读取一个不存在的文件,这会导致一个错误。由于错误没有在回调函数中被处理,它会被抛出为一个未捕获的异常。我们通过监听 uncaughtException 事件来捕获这个异常,并打印错误信息,然后退出进程。

使用 Jest 进行测试

为了测试我们的错误处理逻辑,我们可以使用 Jest 测试框架。首先,我们需要安装 Jest:

npm install --save-dev jest

然后,我们可以编写一个测试用例来模拟未捕获的异常,并断言我们的错误处理逻辑是否按预期工作。

创建一个 test19.test.js 文件,包含以下内容:

// 文件:test19.test.js

function setupUncaughtExceptionListener() {
  process.on('uncaughtException', (error) => {
    console.error('Unhandled exception:', error);
  });
}

describe('setupUncaughtExceptionListener', () => {
  it('应使用“uncaughtException”调用process.on', () => {
    // 监视 process.on 方法
    const processSpy = jest.spyOn(process, 'on');

    // 调用目标函数
    setupUncaughtExceptionListener();

    // 验证 process.on 是否被调用,并且参数正确
    expect(processSpy).toHaveBeenCalledWith('uncaughtException', expect.any(Function));

    // 清理监视器
    processSpy.mockRestore();
  });

  it('发生uncaughtException时应调用console.error', () => {
    // 监视 console.error 方法
    const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => {});

    // 初始化未捕获异常监听器
    setupUncaughtExceptionListener();

    // 模拟一个未捕获的异常
    const testError = new Error('Test uncaught exception');
    process.emit('uncaughtException', testError);

    // 验证 console.error 是否被调用,并且传入了正确的错误信息
    expect(consoleSpy).toHaveBeenCalledWith('Unhandled exception:', testError);

    // 清理监视器
    consoleSpy.mockRestore();
  });
});

最后,我们可以运行 Jest 来执行测试:

npx jest test19.test.js

如果一切正常,你应该会看到所有测试通过的消息,包括新添加的测试用例,它验证了当 uncaughtException 事件发生时console.error是否被正确调用,并且输出了预期的错误信息。
这个测试案例展示了如何在 Node.js 环境中模拟未捕获的异常事件,并验证相关的错误处理函数是否按预期工作。通过使用 jest.spyOn .mockImplementation,我们能够监视和断言 console.error 的调用,同时避免了在测试中输出不必要的错误信息。

在 Jest 中,还原模拟的函数通常使用mockRestore()方法(对于通过jest.spyOn创建的模拟)或者直接将函数赋值回原来的实现(对于直接赋值模拟的情况)。这样,每个测试用例都可以在一个干净的环境中运行,不受之前测试用例的影响

总结

正确处理未捕获的异常对于维护 Node.js 应用的稳定性至关重要。通过监听 uncaughtException 事件,并在必要时进行适当的清理和退出,我们可以避免一些突发的错误导致整个应用崩溃。同时,使用 Jest 进行测试可以帮助我们确保我们的错误处理代码按预期工作。


http://lihuaxi.xjx100.cn/news/2131097.html

相关文章

Composer常见错误解决

Composer 是 PHP 社区广泛使用的一个依赖管理工具,它帮助开发者定义、管理和安装项目所需的库。在使用 Composer 的过程中,可能会遇到各种错误和问题。以下是一些常见的 Composer 错误及其解决方法: 1. 内存限制错误 错误信息:P…

|行业洞察·趋势报告|《2024旅游度假市场简析报告-17页》

报告的主要内容解读: 居民收入提高推动旅游业发展:报告指出,随着人均GDP的提升,居民的消费能力增强,旅游需求从传统的观光游向休闲、度假游转变,国内人均旅游消费持续增加。 政府政策促进旅游市场复苏&…

面试前端八股文十问十答第一期

面试前端八股文十问十答第一期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)http 和 https 的基本概念 H…

手把手写深度学习(25):下载并清洗WebVid-10M数据集

手把手写深度学习(0):专栏文章导航 前言:WebVid-10M是一个大型文本-视频配对数据集,时至今日,依旧是做视频理解、视频生成等任务的首选数据集。这篇博客手把手详细教大家如何下载和清洗这个数据集。 目录 下载Meta CSV文件 下载…

江协科技STM32:按键控制LED光敏传感器控制蜂鸣器

按键控制LED LED模块 左上角PA0用上拉输入模式,如果此时引脚悬空,PA0就是高电平,这种方式下,按下按键,引脚为低电平,松下按键,引脚为高电平 右上角PA0,把上拉电阻想象成弹簧 当按键…

36-递归与迭代

36-1 用递归和迭代解决问题 1、求n的阶乘 公式: n!123...(n-1)n。用递归方式定义:0!1,n!(n-1)!n。 代码1: 我们先回忆一下之前用循环怎么实现的吧 非递归,也可称迭代: int main() {int n 0;scanf(&q…

Git 命令总览

Git Git 是一个版本控制系统,用于管理项目代码。通过 Git 可以轻松地进行代码的提交、更新和合并,确保项目代码的安全性和稳定性。同时,Git 还提供了丰富的工具和功能,如分支管理、代码审查、版本回退等,帮助开发更好…

快速上手Pytrch爬虫之爬取某应图片壁纸

一、前置知识 1 爬虫简介 网络爬虫(又被称作网络蜘蛛、网络机器人,在某些社区中也经常被称为网页追逐者)可以按照指定的规则(网络爬虫的算法)自动浏览或抓取网络中的信息。 1.1 Web网页存在方式 表层网页指的是不需要提交表单&…