nodejs中的错误类型及捕获处理

2023-09-19 01:32:54

nodejs中的错误类型及捕获处理

node 中,提供了 error 模块,并且内置了标准的 JavaScript 错误,本文将介绍在node中错误类型以及如何捕获。

错误类型

js错误

标准的js错误,跟在浏览器中运行js时提示的错误类型一样

RangeError

当一个值不在其所允许的范围或者集合中。

例如不能将数字的有效位数位 1-100,将其设置为 200 就出现RangeError错误。

const num = 1;
num.toPrecision(200);

在这里插入图片描述

ReferenceError

引用未声明的变量。

console.log(undefinedVariable);

在这里插入图片描述

SyntaxError

解析时发生语法错误。

一般SyntaxError在构建阶段,甚至本地开发阶段就会被发现。

constt a;
lett b;
varr c;

在这里插入图片描述

TypeError

值类型不对,当传入函数的操作数或参数的类型并非操作符或函数所预期的类型时,将抛出一个 TypeError 类型错误。

const nul = null;
console.log(null.value);

在这里插入图片描述

URIError

URI函数被错误使用时抛出(比如字符串包含了%字符,执行decodeURIComponent时就会报错)

console.log(decodeURIComponent("https:/example.com%"));

在这里插入图片描述

EvalError

调用eval()失败时抛出

系统错误

系统错误是对JavaScript错误Error对象的一个扩展,它们表示程序能够处理的操作错误,这些错误信息都是在系统级别生成的(比如我们想打开一个文件,但是系统中不存在这个文件,就会抛出系统错误)。

const fs = require("fs");
fs.readFile("/null", (err, data) => {
  if (err) console.log(err);
  else console.log(data);
});

在这里插入图片描述

assert断言错误

通过 assert 模块抛出的错误。

const assert = require("assert");
const a = 1;
assert(a > 10, "a不能小于10");
console.log("last");

在这里插入图片描述

自定义错误

通过throw手动抛出错误:

const a =1;
if(a < 2) {
	throw Error('小于2')
}

在这里插入图片描述

捕获处理

同步代码

同步代码中的异常使用try...catch结构即可捕获处理。

try {
  throw new Error('error');
} catch (e) {
  console.error(e.message);
}

异步代码

使用回调函数

不过大多数Node.js核心API都提供了回调函数来处理错误,比如:

const fs = require("fs");
fs.readFile("/null", (err, data) => {
  if (err) console.log(err);
  else console.log(data);
});

通过回调函数的err参数来检查是否出现错误,再进行处理。Node.js之所以采用这种错误处理机制,是因为异步方法所产生的方法并不能简单地通过try...catch机制进行拦截。

如果在程序执行过程中出现了未捕获的异常,那么程序就会崩溃,因此先把错误进行捕获后传递到回调函数中,就不会让程序奔溃,后续代码也能被顺利运行

使用process模块

因为异常并不是事先准备好的,不能控制其到底在哪儿发生,所以我们可以通过监听应用进程的错误异常,从而捕获到不能预料的错误异常,保证应用不至于奔溃。

process.on('uncaughtException', (e)=>{
  console.error('process error is:', e.message);
});

通过使用process模块监听uncaughtException事件,可以捕获到整个进程包含异步中的错误信息。

当异常出现时,对应执行栈中断,process捕获的异常事件导致v8引擎的垃圾回收功能不能按照正常流程工作,然后开始出现内存泄漏问题。

相对于异常来说,内存泄漏也是一个不能忽视的严重问题,而process.on('uncaughtException')的做法,很难去保证不造成内存的泄漏。所以当捕获到异常时,显式的手动杀掉进程,并开始重启node进程,即保证释放内存,又保证了保证服务后续正常可用。

process.on('uncaughtException', (e)=>{
  console.error('process error is:', e.message);
  process.exit(1);
  restartServer(); // 重启服务
});
更多推荐

组合拳SSRF+redis未授权访问

目录一、SSRF二、redis未授权访问三、组合利用1.写入Webshell2.反弹shell一、SSRF一台web服务器对其他服务器发起请求,以加载其他服务器的web内容或数据但因请求参数没有进行严格过滤,攻击者可能会通过SSRF漏洞来访问敏感数据、执行未经授权的操作,或者将服务器用于发起攻击其他系统的请求。二、re

基于YOLOv8模型的深海鱼目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOv8模型和BDD数据集的自动驾驶目标检测系统可用于日常生活与海洋中检测与定位深海鱼目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集,使用Pysdie6库来搭建前端页面展示系统。另外本系统

探索以太坊 Layer 2 解决方案的后起之秀——Starknet

作者:stella@footprint.network数据来源:StarknetDashboard“区块链三难题”,或“可扩展性三难题”,强调了区块链平台想要去平衡安全性、去中心化和可扩展性将面临的挑战。通常情况下,区块链架构只能有效地优先考虑其中两个难题。例如,以太坊优先考虑了安全性和去中心化,导致了可扩展性方面面临

1. 快速体验 VSCode 和 CMake 创建 C/C++项目

1.快速体验VSCode和CMake创建C/C++项目本章的全部代码和markdown文件地址:CMake_Tutorial,欢迎互相交流.此次介绍的内容都是针对于Linux操作系统上的开发过程.1.1安装开发工具VSCode:自行下载安装,然后安装插件Cmake:在Ubuntu系统上,可以采用apt工具安装:sudo

本地Tomcat网页搭建结合Cpolar内网穿透实现公网访问

文章目录1.前言2.本地Tomcat网页搭建2.1Tomcat安装2.2配置环境变量2.3环境配置2.4Tomcat运行测试2.5Cpolar安装和注册3.本地网页发布3.1.Cpolar云端设置3.2Cpolar本地设置4.公网访问测试5.结语1.前言Tomcat作为一个轻量级的服务器,不仅名字很有趣(让人想起童年)

探索Linux内核参数的妙用:深入理解配置,打造高效运行环境

文章首发地址Linux内核参数是指可以在Linux操作系统中通过修改内核参数来调整系统行为的设置。这些参数控制了操作系统的各种功能和特性,包括内存管理、网络协议、文件系统、进程调度等。在Linux中,内核参数可以通过多种方式进行修改和配置,包括在启动时通过传递命令行参数、通过sysctl命令动态修改、通过修改配置文件等

ESP32低功耗蓝牙BLE通信

ESP32低功耗蓝牙BLE通信蓝牙分类GATT协议GATT角色ESP32蓝牙简介ESP32开发板作为BLE服务设备或扫描设备手机APP连接作为BLEServer的ESP32总结蓝牙分类经典蓝牙ClassicBluetooth):用于数据量比较大的传输,如:图像、视频、音乐等。低功耗蓝牙(BluetoothLowEner

学习笔记:卸载nav2 navigation2导航

nav2二进制文件安装nav2导航安装方式分为二进制文件安装和源码方式安装,如果想用最快的方式跑通代码,推荐二进制安装,不用编译,没有缺少依赖编译失败的烦恼,安装命令:sudoaptinstallros-$ROS_DISTRO-navigation2ros-$ROS_DISTRO-nav2-bringupros-$RO

AIMS医院手术麻醉信息系统全套源码,自主版权,开箱即用

手术麻醉临床信息系统有着完善的临床业务功能,能够涵盖整个围术期的工作,能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施,能够规范麻醉科的工作流程,实现麻醉手术过程的信息数字化,自动生成麻醉的各种医疗文书,完成共享HIS、LIS、PACS和EMR等手术患者信息,从而提高麻醉、手术工作的管理水平。系统包

JVM架构和内存管理优化

Java虚拟机(JVM)是Java编程语言的核心组件,负责执行Java字节码并提供运行时环境,使得Java程序可以在不同的平台上运行。了解JVM的工作原理和内存管理对于优化代码性能和理解Java的内存管理和垃圾收集机制非常重要。在本文中,我们将详细讲解JVM的架构、类加载器、运行时数据区、执行引擎、本地方法接口以及内存

Android 小组件 AppWidgetProvider

一、相关文档二、小组件是什么?三、AppWidget核心类AppWidgetProvider源码解读和原理分析1、先看AppWidgetProvider源码2、AppWidgetProvider回调方法分析onUpdate(Contextcontext,AppWidgetManagerappWidgetManager,

热文推荐