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

chatgpt/2023/9/24 3:01:24

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(); // 重启服务
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-5413949.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

Stable Diffusion - 采样器 DPM++ 3M SDE Karras 与 SDXL Refiner 测试

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132978866 Paper: DPM-Solver: Fast Solver for Guided Sampling of Diffusion Probabilistic Models 扩散概率模型&#xff08;DPMs&#xff09;…

libevent 定制——libevent 定制多线程

libevent 定制多线程 文章目录 libevent 定制多线程开启多线程定制多线程调试锁的使用 编写多线程程序的时候,在多个线程中同时访问同样的数据并不总是安全的。 libevent 的结构体在多线程下通常有三种工作方式: 某些结构体内在地是单线程的:同时在多个线程中使用它们总是不安全…

CSS动效合集之实现气泡发散动画

前言 &#x1f44f;CSS动效合集之实现气泡发散动画&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 定义一个数组bubbles&#xff0c;用来存储气泡列表的基本新&#xff0c;w表示宽高&#xff0c;x表示绝对定位…

使用 Docker 安装 Elasticsearch (本地环境 M1 Mac)

Elasticsearchkibana下载安装 docker pull elasticsearch:7.16.2docker run --name es -d -e ES_JAVA_OPTS“-Xms512m -Xmx512m” -e “discovery.typesingle-node” -p 9200:9200 -p 9300:9300 elasticsearch:7.16.2docker pull kibana:7.16.2docker run --name kibana -e EL…

AOSP Android 系统源码编译出的framework.jar和android.jar之间的区别

简介 AOSP&#xff08;Android Open Source Project&#xff09;编译出的 android.jar 和 framework.jar 都是 Android 平台开发中的重要组件&#xff0c;但它们有不同的作用和用途&#xff1a; android.jar&#xff1a; 用途&#xff1a;android.jar 包含了 Android API 的定…

【Linux】【驱动】平台总线模式platform模型的编写,操作LED灯

【Linux】【驱动】平台总线模式platform模型的编写&#xff0c;操作LED灯 续devicedriverapp操作指令 续 平台总线模式&#xff0c;将设备和驱动进行了区分&#xff0c;据说可以优化代码的可移植性 device&#xff1a;实现对设备寄存器的申明 dirver: 则从总线中取数据&#x…

【牛客刷题】最小k个数

最小k个数 https://www.nowcoder.com/share/jump/9321389651694956999635 采用优先级队列构造小顶堆&#xff0c;时间复杂度为O(n * log n)&#xff0c;空间复杂度O(n)&#xff1a; priority_queue<int, vector, greater> qp; vector<int> GetLeastNumbers_Solut…

redis桌面连接工具Another Redis Desktop Manager使用介绍

Another Redis Desktop Manager是一种类似于navicat的数据库连接工具&#xff0c;专门用来连接redis&#xff0c;使用起来非常简单方便&#xff0c;在这里推荐给大家。 没有用过这个软件的&#xff0c;首先通过下面的网盘链接下载Another Redis Desktop Manager 百度网盘redi…
推荐文章