文章目录

  • Node.js异常特点
  • 异常的捕获处理
    • 同步异常
    • 异步异常
      • callback
      • event
      • Promise
      • Async/Await
    • uncaughtException异常

Node.js异常特点

Node.js异步单线程模型对于异常捕获处理影响:
异步:Node.js异常不只可能出现在同步代码中,也可能出现在异步代码中,而异步异常捕获处理方式有别于同步异常。
单线程:如果不捕获处理程序运行时发生的异常,应用进程将因为异常而立即退出。

异常的捕获处理

同步异常

JavaScript 语言提供的 try…catch 语句处理

// 抛出一个 ReferenceError,因为 z 未定义。
try {const m = 1;const n = m + z;
} catch (err) {// 在这里处理错误。console.error(err); // ReferenceError: z is not defined
}

所有 JavaScript 错误都会被作为异常处理,异常会立即产生并使用标准的 JavaScript throw 机制抛出一个错误。JavaScript 的 throw 机制的任何使用都会引起异常,必须使用 try…catch 处理,否则 Node.js 进程会立即退出。Node.js少数例外的同步的 API(任何不接受 callback 函数的阻塞方法,例如 fs.readFileSync)也会使用 throw 报告错误。

异步异常

callback

错误优先的回调函数:该函数会接受一个 Error 对象传入作为第一个参数。 如果第一个参数不是 null 而是一个 Error 实例,则说明发生了错误,应该进行处理。

const fs = require('fs');
fs.readFile('一个不存在的文件', (err, data) => {if (err) {console.error('读取文件出错!', err);return;}// 否则处理数据
});

event

error 事件机制:当一个异步方法被一个 EventEmitter 对象调用时,错误会被分发到对象的 ‘error’ 事件上。

const net = require('net');
const connection = net.connect('localhost');// 添加一个 'error' 事件句柄到一个流:
connection.on('error', (err) => {// 如果连接被服务器重置,或无法连接,或发生任何错误,则错误会被发送到这里。 console.error(err);
});connection.pipe(process.stdout);

Promise

Promise.prototype.catch()

const promise = new Promise(function(resolve, reject) {throw new Error('promise error');
});
promise.catch(function(error) {console.error(error); // Error: promise error
});

Async/Await

  1. try…catch:async/await让异步操作同步执行,可以使用跟同步异常捕获的方式捕获处理async函数的异常。
async function f() {try {await Promise.reject('出错了');} catch(e) {console.error(e); // 出错了}return await Promise.resolve('hello world');
}f().then(v => console.log(v)) // hello world
  1. Promise.prototype.catch():Async/Await 本质也是基于Promise的,同样可以使用Promise.prototype.catch()捕获处理异常。
async function f() {await Promise.reject('出错了').catch(e => console.error(e)); // 出错了return await Promise.resolve('hello world');
}f().then(v => console.log(v)) // hello world

uncaughtException异常

没有人可以确保代码没有异常,同样也没有人可以确保代码里的异常能百分百被捕获处理。当未捕获的 JavaScript 异常一直冒泡回到事件循环时,则会触发 ‘uncaughtException’ 事件。

process.on('uncaughtException', (e)=>{  console.error(e); // Error: uncaughtException// do something: 释放相关资源(例如文件描述符、句柄等)process.exit(1); // 手动退出进程
});throw new Error('uncaughtException')

注意: 正确使用 uncaughtException
uncaughtException 是用于异常处理的粗略机制,仅用作最后的补救手段。 未处理的异常本质上意味着应用程序处于某种未知状态。在 uncaughtException 之后继续执行操作是不安全的,因为异常不可预料的发生后,程序直接从对应执行栈中断而到process捕获的异常事件下,导致了v8引擎的垃圾回收功能不能按照正常流程工作,然后出现内存泄漏问题。uncaughtException 的正确用法是在关闭进程之前对分配的资源(例如文件描述符、句柄等)执行同步清理并手动退出进程,使用进程管理工具(如pm2,docker等)监视故障重新启动。

参考资料:
Node.js官方手册 - Error
Node.js官方手册 - Process
ES6 入门教程- ECMAScript 6入门 - 阮一峰

Node.js异常捕获处理相关推荐

  1. Node.js异常(例外)处理

    一.异常处理 1.比如输入浏览器的路由的时候,当路由输入一个不存在的路径的时候,这个时候就会直接报错,报错之后server就会崩溃,然后就要手动启动服务,对于一个服务器而言是不能容忍的.这个时候就要用 ...

  2. Fundebug后端Node.js插件更新至0.2.0,支持监控Express慢请求

    摘要: 性能问题也是BUG,也需要监控. Fundebug后端Node.js异常监控服务 Fundebug是专业的应用异常监控平台,我们Node.js插件fundebug-nodejs可以提供全方位的 ...

  3. 介绍适用于Visual Studio的node.js工具

    Just when you thought it couldn't be crazier in Redmond, today they are introducing node.js Tools fo ...

  4. oracle异常抛出,ORACLE 存储过程异常捕获并抛出

    for tab_name in tables loop execute immediate 'drop table '||tab_name; --此处可能会报错 end loop; 当前情况是,循环表 ...

  5. 高效利用Fundebug追踪Node.js日志发现问题

    不管使用哪个语言做项目开发,我们都会自觉地用日志来做相关记录.比如,HTTP请求,报错信息.某些关键节点埋点记录等等.在Java中有大名鼎鼎的Log4J,于是在Node.js中也有了log4js. 日 ...

  6. node.js 使用domain模块捕获异步回调中的异常

    和其他服务器端语言相比,貌似node.js 对于异常捕捉确实非常困难. 首先你会想到try/catch ,但是在使用过程中我们会发现并没有真正将错误控制在try/catch 语句中. 为什么? 答案是 ...

  7. domain: node.js的异常捕获利器

    众所周知,异常捕获是保障服务健壮性常用的手段,node.js也自然支持这一特性.但node.js异步.基于消息的编程方式给异常捕获带来一些困难,请看下面的例子: process.on('uncaugh ...

  8. atitit.js浏览器环境下的全局异常捕获

    atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...

  9. js监听多个事件_JavaScript中的事件与异常捕获解析

    这篇文章主要给大家介绍了关于JavaScript中事件与异常捕获的相关资料,文中通过示例代码介绍的非常详细,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批 ...

最新文章

  1. python 速度矢量_最近邻搜索4D空间python快速-矢量化
  2. python 函数的调用的时候参数的传递_python定义函数时的参数调用函数时的传参...
  3. mysql 逻辑型_17. 逻辑运算符
  4. anaconda 更改路径_Anaconda更改Jupyter 默认启动路径
  5. 使用图形芯片加速电子自动化设计应用程序
  6. 平果手机桌面计算机,苹果手机便签记事本怎么在Windows电脑桌面上使用?
  7. Effective objective-C 读书笔记 (第一部分)
  8. 6大新品重磅发布,华为云全栈云原生技术能力持续创新升级
  9. 正则——16进制颜色
  10. vue中面包屑的实现方法
  11. web开发中添加分享按钮
  12. rstudio 保存_R: RStudio的中文读取、保存与显示
  13. 手机平板功放芯片BCT8933,PINtoPIN替换AW8733
  14. 乘风领航、耀世创新——DEFI平台Lizard打造数字金融新世界
  15. 在github上托管属于自己的网页
  16. Python一个回合制兵棋小游戏(1)
  17. 彩光价格一般是多少_彩光治疗价格是多少
  18. 列车车载安全计算机作用l,[计算机]高速铁路列控车载设备的发展.pdf
  19. 局部变量和全局变量,如何减少全局变量的频繁使用
  20. Oracle SQL优化 总结(大师级别)

热门文章

  1. 用wdcdn快速搭建CDN测试环境
  2. 智能家居开源平台——智汀家庭云(开发环境搭建)
  3. html布局flex有什么优势,flex布局的优缺点是什么
  4. 拙著《大象-Thinking in UML》已在互动出版网http://www.china-pub.com/129881开始出售,12月1日全国各大书店有售,敬请关注!^_^
  5. 乙醇的selenium java_揭秘webdriver实现原理 | 乙醇的开源自动化工具研究Blog
  6. 一级计算机怎么给学生备注,2021年全国计算机一级考试重点讲解:(一级WPS)WPS演示中备注添加的两招...
  7. jpa日志 logback_SpringBoot | 第二十五章:日志管理之自定义Appender
  8. Spring部分配置总结
  9. html制作菱锥旋转,几何画板制作“虚实变化”的旋转正棱锥和正棱柱
  10. VaR值计算性能千倍提升——某头部外资银行实例分享