几种常见异常:
- throw new Error('xxxx') // 手动或程序抛出的异常
- JSON.parse(json) // 当我们不确定json是否合法时这里会经常发生SyntaxError异常
-
function(err,data){
res.write(dat) // ReferenceError:dat is not defind
} -
var EventEmitter = require('event').EventEmitter;
var ev = new EventEmitter()
ev.emit('todo')
ev.on('todo',()=>{/*do something*/}) // 报错;典型的未绑定先调用 -
first error callback 要先判断err是否存在
fs.readFile('./my.txt',function(err,buf){
todo(buf) // 如果fs.readFile发生错误 buf是无法获取的
}) -
try{
fs.readFile('./my.txt',function(err,buf){
/*do something.... */
throw new Error('.....')
})
}catch(err){
// 这样是无法捕获异常callback的异常的,因为try-catch 与 callback 不同一个调用栈,这样异常最后会进入EventLoop在那里最终被捕获,最终会导致程序崩溃
}
处理方法:
- 适当位置使用try-catch
- 使用代码检查工具 JSHint (推荐)
- npm i jshint -S
- 项目根目录创建 .jshintrc文件(记得前面有一点)
- 配置
{
"node":true,
"undef":true
}
说明:1.告诉JSHint检查的是Node端代码,以防Node特有的全局变量使用时报错
2.检查未定义变量 - 在package.json 的 配置
{
"script":{
"lint":" jshint * "
}
} - npm run lint // 就会对项目的所有js文件进行检查
- 使用作用域来处理未捕获异常 domain模块的介绍(待上线)
- 程序最后“一道防线"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分钟内服务器没有响应返回给客户端,客户端的链接就会被重置断开。