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

引言

在 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.jsfunction 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://www.mzph.cn/news/786762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NFS环境搭建与在K8s的应用

第一部分&#xff1a;配置 docker 1.1、配置Nginx&#xff0c;转发 nexus 上传包的请求 sudo tee /etc/nginx/conf.d/k8s.conf <<-‘EOF’ HTTPS 服务器块 server { listen 443 ssl; server_name sls.registry.k8s; # SSL 证书配置 ssl_certificate /home/projectnam…

JimuReport积木报表 v1.7.4 正式版本发布,免费的JAVA报表工具

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

【GenAI】使用GenAI堆栈构建视频分析和转录字幕聊天机器人

【GenAI】使用GenAI堆栈构建视频分析和转录字幕聊天机器人 目录 【GenAI】使用GenAI堆栈构建视频分析和转录字幕聊天机器人高层架构入门指南克隆存储库指定您的API密钥构建和运行应用程序使用yt-whisper提交视频访问Dockerbot聊天服务结论推荐超级课程: Docker快速入门到精通K…

【数字后仿】isolation Cell基础

1、在芯片验证中,“isolation” 和 “复位值(reset value)” 是两个可能相关联但不同的概念。解释一下这两个术语: Isolation(隔离):在多电源域(power domain)的芯片设计中,当其中一个电源域关闭时(比如为了节能),隔离机制确保关闭的电源域不会影响到其他仍在工作…

Qt加载.css/.qss文件设置控件的QSS样式(支持程序运行时修改且立即生效类似换肤效果)

初学Qt时&#xff0c;你是如何设置QWidget&#xff0c;QPushButton等原生基础控件的样式的&#xff1f;是不是主要是两种方法&#xff1f; 1.直接在可视化的.ui文件中直接添加qss语句。 2.在代码中通过setStyleSheet(QString qss)来设置qss语句。 上述两种方法&#xff0c;在程…

【数据结构】你知道波兰表达式和逆波兰表达式吗?我才知道原来栈在表达式求值中还能这样使用……

栈在表达式求值中的应用 导读一、表达式的形式二、波兰表达式与逆波兰表达式三、表达式之间的相互转换四、栈实现波兰表达式4.1 问题分析4.2 问题完善4.3 算法实现4.3.1 获取波兰表达式4.3.2 从右往左扫描表达式4.3.3 遇到操作数进行入栈操作4.3.4 遇到操作符进行对应操作4.3.5…

Qt元对象系统

第二章Qt元对象系统 文章目录 第二章Qt元对象系统1.什么是元对象&#xff1f;2.元对象系统组成3.信号与槽信号和槽的本质绑定信号与槽自定义槽定义槽函数必须遵循一下规则槽函数的类型自定义槽案例 自定义信号自定义信号需要遵循以下规则信号和槽重载二义性问题 4.内存管理1. 简…

【数据库索引】【面试题】【SQL】什么时候不需要用索引?

在数据库查询优化中,索引是一种重要的工具,可以提高查询性能。然而,并不是所有的情况下都适合使用索引。 以下是一些情况下(收集整理)不建议使用索引: 更新频繁的列:索引会占用数据库资源,当列经常被更新时,索引可能会变得过时,导致查询性能下降。 小数值类型:对于…

原生小程序开发性能优化指南

性能优化指南 1.骨架屏 业务可以在数据加载完成之前用骨架屏幕来占位&#xff0c;提升体验。 2.包大小优化 减小包中静态资源&#xff0c;例如图片文件&#xff0c;可将图片进行压缩降低文件体积。无用文件、函数、样式剔除。除了部分用于容错的图片必须放在代码包&#xf…

跨平台移动端开发技术对比

跨平台移动端开发技术对比 移动互联网时代,开发一款App通常需要覆盖iOS和Android两大平台。为了提高开发效率、控制成本,很多团队会选择跨平台开发的技术方案。目前主流的跨平台开发技术包括React Native、Flutter、Weex、uni-app等。本文将对比分析几种主流跨平台技术的优劣。…

了解游戏相关知识

个人笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔&#xff1a;工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 目录 一&#xff1a…

【嵌入式DIY实例】-DIY便携式粉尘分析仪

DIY便携式粉尘分析仪 文章目录 DIY便携式粉尘分析仪1、硬件准备2、硬件接线3、代码实现细粉尘分析仪是一种用于监测废气通过管道、烟囱或烟道时悬浮在废气中的粉尘或细颗粒浓度的装置; 通常,来自工业燃烧过程或空气过滤系统的废气。 悬浮在大气中一段时间的固体颗粒构成尘埃。…

MySQL常见故障案例与优化介绍

前言 MySQL故障排查的意义在于及时识别并解决数据库系统中的问题&#xff0c;确保数据的完整性和可靠性&#xff1b;而性能优化则旨在提高数据库系统的效率和响应速度&#xff0c;从而提升用户体验和系统整体性能。这两方面的工作都对于保证数据库系统稳定运行、提升业务效率和…

加域报错:找不到网络路径

在尝试将计算机加入Windows域时&#xff0c;如果收到“找不到网络路径”的错误提示&#xff0c;可能的原因及解决方法如下&#xff1a; 网络连接问题&#xff1a;确保计算机与域控制器之间的物理网络连接是正常的&#xff0c;可以通过ping命令测试与域控制器的连通性。例如&…

LeetCode 56. 合并区间

以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;intervals [[1,3…

HarmonyOS 应用开发之LifecycleService接口切换LifecycleData接口切换

LifecycleService接口切换 FA模型接口Stage模型接口对应d.ts文件Stage模型对应接口onStart?(): void;ohos.app.ability.ServiceExtensionAbility.d.tsonCreate(want: Want): void;onCommand?(want: Want, startId: number): void;ohos.app.ability.ServiceExtensionAbility.…

算法训练营第27天|LeetCode 39.组合总和 40.组合总和2 131.分割回文串

LeetCode 39.组合总和 题目链接&#xff1a; LeetCode 39.组合总和 解题思路&#xff1a; 用回溯的方法&#xff0c;&#xff0c;注意这次回溯不是i1&#xff0c;而是i&#xff0c;是因为可用重复选取。 代码&#xff1a; class Solution { public:vector<vector<i…

nginx怎么配置https访问

一、安装nginx yum -y install nginx二、准备证书 申请证书&#xff0c;并将证书上传到/etc/pki/nginx/目录&#xff0c;证书可以在腾讯云等云平台申请 二、配置nginx user root; worker_processes auto;events {worker_connections 1024; }http {include mime.t…

关于ffmpeg的安装和编码格式问题

安装 5.1安装 https://blog.csdn.net/JineD/article/details/113528285 3.4.8安装 https://blog.csdn.net/qq_42528520/article/details/120487457 编码格式 ffmpeg能转很多的视频格式&#xff0c;不同的格式对应的版本也不一样。如上述安装5.1和3.4.8都是一样的流程&#xff0…

mysql故障及解决分析

目录 MySQL 单实例故障排查 MySQL 单实例故障排查 &#xff08;1&#xff09;故障现象 1 ERROR 2002 (HY000): Cant connect to local MySQL server through socket /data/mysql/mysql.sock (2) 问题分析&#xff1a;以上这种情况一般都是数据…