Node.js实战技巧(一)常见异常及处理

几种常见异常:

  1. throw new Error('xxxx') // 手动或程序抛出的异常  
  2. JSON.parse(json) // 当我们不确定json是否合法时这里会经常发生SyntaxError异常
  3. function(err,data){
        res.write(dat)  // ReferenceError:dat is not defind
    }

  4. var EventEmitter = require('event').EventEmitter;
    var ev = new EventEmitter()
    ev.emit('todo')
    ev.on('todo',()=>{/*do something*/}) // 报错;典型的未绑定先调用 

  5. first error callback 要先判断err是否存在

    fs.readFile('./my.txt',function(err,buf){ 
        todo(buf) // 如果fs.readFile发生错误 buf是无法获取的 
    })
  6. try{
        fs.readFile('./my.txt',function(err,buf){
            /*do something.... */
            throw new Error('.....')
        })
    }catch(err){
        // 这样是无法捕获异常callback的异常的,因为try-catch 与 callback 不同一个调用栈,这样异常最后会进入EventLoop在那里最终被捕获,最终会导致程序崩溃
    }

处理方法:

  1. 适当位置使用try-catch
  2. 使用代码检查工具 JSHint (推荐)
    1. npm i jshint -S
    2. 项目根目录创建 .jshintrc文件(记得前面有一点
    3. 配置 
      {
         "node":true,
         "undef":true
      }

      说明:1.告诉JSHint检查的是Node端代码,以防Node特有的全局变量使用时报错
                 2.检查未定义变量
    4. 在package.json 的 配置 
      {
         "script":{
             "lint":" jshint * "
          }
      }
    5. npm run lint // 就会对项目的所有js文件进行检查
  3. 使用作用域来处理未捕获异常 domain模块的介绍(待上线)
  4. 程序最后“一道防线"uncaughtException" ,它是在整个Node程序的层面上监听异常,这样你的Node程序就不会崩溃啦!!!然而并不是万能。这样做久而久之就会导致内存泄漏,程序极其不稳定。一般建议用在cluster的多进程模型中的子进程上,然后加上日志打点去进一步排查异常原因
    process.on('uncaughtException',function(err){
        console.log(err)
        //process.exit(1)
    })

     

扩展说明:uncaughtException 可能会导致内存泄漏的情况

var http = require('http')

var app = http.createServer((req,res)=>{
    response.end('error') // response 未定义 抛出异常
})

process.on('uncaughtException',err=>{
    console.log(err)   // 日志打点
    app.close() // 服务器停止接收新的请求
    setTimeout(process.exit,5000,1) // 5秒后关闭进程,让其他连接处理后再结束进程
})

异常在会被捕获,然而用户的请求一直都没有响应,即打开的sockets迟迟不关闭,内存资源就不能及时被释放掉,这往往就会导致内存泄漏,不单单是socket连接还有文件句柄也是如此。另外说一下,Node.js做服务器时,过长的请求响应会阻塞IO,造成极差的用户体验,特别对于Node.js这种单线程应用来说,影响可以说是灾难性的,所以有一个默认时长的概念(2分钟)在2分钟内服务器没有响应返回给客户端,客户端的链接就会被重置断开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值