uncaughtException 未捕获的异常, 当node.js 遇到这个错误,整个进程直接崩溃.

或许这俩个人上辈子一定是一对冤家.

或许这俩个人经历了前世500次的回眸才换来了今生的相遇,只可惜在错误的时间,错误的地点,做了错误的事!

什么是uncaughtException

uncaughtException 是一种未捕获的异常,它是node.js 进程上的一个事件,直接挂在 process 上.

什么时候会遇到uncaughtException

1.当你的程序出错了

2.这个错误还没有被 try ...  catch 住

以上2个条件同时发生时, 说明当前的一个异常会一直冒泡到事件循环为止.

然后打印出异常堆载错误

接着触发进程 exit 事件,

最后node.js 进程就会束手就擒的挂掉

uncaughtException的时候我们能不能挽救一下?

其实这个时候已经迟了!

因为上面已经说了 uncaughtException 是挂在 process 上的一个事件

如果走到这一步,说明异常已经冒泡到事件轮询为止.

node.js 的特征是什么? 就是异步io,事件轮询,处理回调 ---  轮询已经停止,积压的callbac如何回调,骚年,只好一个人面对 process 的 crash 了!

一旦走到这步,代码类似这样:

if(!process.emit('uncaughtException',err)){
        console.error(err.stack);
        process.emit('exit',1);
}

有人说 uncaughtException 事件回调里就什么都不能做吗?

能做!

但是很有限.

当用户访问你的站点时,一个未捕捉的异常触发了 uncaughtException 事件,眼看站点要崩溃,但是傻傻的用户还在浏览器面前痴痴的等待这结果,其实这时你最想告诉用户" 服务器正在维护中,请稍后访问 " 逼格一下提升式了很多,有木有,而且一定会为自己如此棒的用户体验心里暗爽.

不要意淫了,这是不可能的.

单线程异步回调,无阻塞IO 带给我们高性能体验的时候,也埋下了无数的坑,这就是一个比较深的,上帝总是公平的,给了你一个强有力的长矛,就不会再给你坚而不催的盾.

当 uncaughtException 事件被触发时,已经经过了几次异步回调,冒泡了多少回循环,恐怕它自己都不清楚.......

不仅仅是找不错出错的堆栈,而且还失去了当前的上下文,这种情况下,你手上连用户请求链接的 response 对象都没有,如何 send() 出去一句高大上的"服务器正在维护中,请稍后访问"

process.on('uncaughtException', function(err){

//所以这里的回调你不要妄想太多,打算打印一下错误信息还是可以的

console.log(err); //注意这个错误信息并没有错误发生时的堆栈信息

//然后你还可以做一些手脚,优雅的退出

});

如何避免走到 uncaughtException 这一步?

很简单,就是把每一个错误捕捉住

说起来简单,做起来非常难!

每一个程序员可以拍着胸口说我写的程序没有bug,每一个异常都做了捕捉,想必是不可能的,就算你的代码很健壮,你引用的模块就不会引发一个异常吗?

那我们是不是在每一处调用 try ... catch

不完全是, try ...  catch 是可以捕捉异常,但是限于当前执行堆栈,直观的理解就是同步运行的代码是有效的,如下

var num=function(p){
    try{
        return parseInt(p);
    }catch(e){
        console.log(e);
        return 0;
    }
}

但是异步执行环境下,try .... catch 并不能捕捉,因为异常是发生在当前执行堆栈之外,如下:

var num=function(p){
    try{
        parse_num(p,function(err,p1){
            if(!err)
                return p1;
            else
                return 0;
        });
    }catch(e){
        console.log(e);
        return 0;
    }
}

上面 try 部分中调用 函数 parse_num ,此函数异步回调返回了 err 和 转化参数 p1 ,但是在异步调用过程中转化数字出现异常,对于 try . ... catch 是未知的.这时他们就无能为力了.

避免uncaughtException错误引起node.js进程崩溃的更多相关文章

  1. node.js 进程崩溃处理

    process.on('uncaughtException', (err) => { console.error('有错误'); });

  2. 拿什么守护你的Node.JS进程: Node出错崩溃了怎么办? foreverjs, 文摘随笔

    守护进程 方案一 npm install forever https://github.com/foreverjs/forever 方案二 npm install -g supervisor http ...

  3. 拿什么守护你的Node.JS进程: Node出错崩溃了怎么办?

    被吐嘈的NodeJS的异常处理 许多人都有这样一种映像,NodeJS比较快: 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务: 它比较适合对并发要求比较高,而且简单的业务场景. 在E ...

  4. 深入理解 Node.js 进程与线程

    原文链接: https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651557398&idx=1&sn=1fb991da ...

  5. Node.js进程管理之子进程

    一.理论 之前看多进程这一章节时发现这块东西挺多,写Process模块的时候也有提到,今天下午午休醒来静下心来好好的看了一遍,发现也不是太难理解. Node.js是单线程的,对于现在普遍是多处理器的机 ...

  6. Node.js进程管理之Process模块

    在前面Node.js事件运行机制也有提到,Node.js应用在单个线程运行,但是现在大部分服务器都是多处理器,为了方便使用多个进程,Node.js提供了3个模块.Process模块提供了访问正在运行的 ...

  7. Node.js 进程

    process 是全局对象,能够在任意位置访问,是 EventEmitter 的实例. 退出状态码 当没有新的异步的操作等待处理时,Node 正常情况下退出时会返回状态码 0 .下面的状态码表示其他状 ...

  8. Process Node.js 进程

    Process 进程 process.argv 是命令行参数数组,第一个元素是node,第二个元素是脚本文件名,从第三个元素开始每个元素是一个运行参数. process.stdout 标准输出流 co ...

  9. Node.js进程管理之进程集群

    一.cluster模块 Node.js是单线程处理,对于高并发的请求怎么样能增加吞吐量呢?为了提高服务器的利用率,能不能多核的来处理呢?于是就有了cluster模块. cluster模块可以轻松实现运 ...

随机推荐

  1. 单片机:STC89C52的最小单元

    STC89C52RC是STC公司生产的一种低功耗.高性能CMOS8位微控制器,具有 8K字节系统可编程Flash存储器.STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51 ...

  2. python︱模块加载(pip安装)以及pycharm安装与报错解决方式

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 准备放下R开始学python,真是痛苦,因为找 ...

  3. Flex中的FusionCharts 2D饼图

    1.设计思路 (1)FusionCharts中有Flex组件文件FusionCharts.swc,这样可以让FusionCharts用Flex展示出来: (2)利用xmlns:components=& ...

  4. HTML5可以省略全部标记的元素

    HTML5可以省略全部标记的元素 1.body 2.colgroup 3.html 4.head 5.tbody

  5. eclipse和android studio的爱恨情仇

    Eclipse,以下简称ES(自己起的,不喜勿喷):Android studio,以下简称AS(都这么叫的啦)! 2000年,IBM怀胎24个月,终于产生了Eclipse,当时ES的诞生只是为了解决I ...

  6. 申请Jetbrain教育帐号,免费使用一年

    JetBrains是一家捷克的软件开发公司.旗下IDE产品有(不限于):(1) IntelliJ,IDEA  Java集成开发工具:(2) PHPStorm,PHP 集成开发工具:(3) PyChar ...

  7. 标注-隐马尔可夫模型HMM的探究

    1 HMM基本概念1.1 定义1.2 观测序列生成过程1.3 HMM的三个问题2 概率计算算法2.1 直接计算算法2.2 前向算法forward algorithm2.3 后向算法2.4 一些概率与期 ...

  8. Struts2【拦截器】就是这么简单

    什么是拦截器 拦截器Interceptor.....拦截器是Struts的概念,它与过滤器是类似的...可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Str ...

  9. View的平移、缩放、旋转以及位置、坐标系

    原创 2015年05月12日 13:15:29 标签: Android / Scroll / Scale / Translation / Rotation 24733 Android开发中,经常会接触 ...

  10. Graham凸包算法简介

    凸包真是一个神奇的算法.. 概念 凸包,我理解为凸多边形 叉积 对于向量AB和向量BC,记向量AB*向量BC = AB * BC * sin ∠ABC,而叉积的绝对值其实就是S△ABC/2 对于平面上 ...