资讯专栏INFORMATION COLUMN

node异常总结

csRyan / 2443人阅读

摘要:总结一下以便有更清晰的认知。隐藏的异常说明隐藏的异常不是由触发而是在运行时发生的例如上面常见的这种异常可以使用等工具检查出来。使用域的好处是可以把各式异常放到一个域的异常处理函数中且不影响其他的域。在非阻塞式中一般都是用集中处理异常。

引言

对错误进行分类,理解错误是如何产生的,以及错误发生后怎么定位解决,这在构建一个稳定运行的程序过程中会经常遇到。总结一下,以便有更清晰的认知。

异常分类 显式异常
function validateName(name) {
    if(!name){
        throw new Error("name is required");
    }
}
try {
    validateName();
}catch (err){
    console.log(err.message,err.stack);
}

说明 有以下几点需要注意

一般用于同步方法,或者异步执行前,否则无法捕获异常,process直接exit。

抛出的错误一般都是继承于Error。使用简单的字符串例如(throw "error happen")无法获得调试堆栈信息。

不要在内置的node方法中抛出异常,没有意义,因为在node中回调函数第一个参数就是错误对象,可以直接处理。

隐藏的异常
function getName() {
    return name;
}
getName();

说明 隐藏的异常不是由throw触发,而是在运行时发生的,例如上面常见的ReferenceError,这种异常可以使用eslint等工具检查出来。

no-undef:error
错误事件
var EventEmitter=require("events").EventEmitter;
var ee=new EventEmitter();
ee.on("error",function (err) {
    console.error(err.message,err.stack);
    console.log("end");
});
ee.emit("error",new Error("no handled event error"));

说明 当EventEmitter实例发生错误时,会触发error事件,如果没有error事件的监听器,默认会打印堆栈,然后退出程序。如果实例比较多,想要统一管理,可以使用domain模块管理。例如下面的示例,集中处理connection时发生的异常。

var  domain=require("domain");
var http=require("http");
var d=domain.create();
d.run(function () {
    var server=http.createServer(function (req,res) {
        d.on("error",function () {
            res.statusCode=500;
            res.end("internal server error");
            server.close();
            setTimeout(process.exit,5000,1);
        })
        response.end("hello world");
    }).listen(3000);

});

使用域的好处是,可以把各式异常放到一个域的异常处理函数中,且不影响其他的域。在非阻塞式api中,一般都是用domain集中处理异常。想要全局处理,可以按照下面的方式来个统一处理,不推荐。

var http=require("http");
var server=http.createServer(function (req,res) {
    response.end("hello world");
}).listen("3000");
process.on("uncaughtException",function (err) {
    console.log(err);
})

uncaughtException是最后一道防线,比较好的做法是记录错误信息,然后重启。

错误参数
    fs.readFile("./config.json",function (err,buf) {
        // if(err) throw err;
        if(err)  throw new Error("read file filed");;
        var config=JSON.parse(buf.toString());
        console.log(config);
    })

说明 上述示例中,如果忽略readFile返回的错误,有可能无法获取buf而抛出异常,所以错误参数还是需要处理一下。

问题debug

比较low的方法就是console或者打日志,这个在开发中不用,打日志一般是用来记录查看线上问题;开发中一般都是断点调试,重点分析下。

调试方式一

Node.js 6.3以下,使用老的方式话,node-inspect作为模块需要多带带安装,其作用通过websocket的方式充当一个连接通道,负责dev tool和node中运行程序产生的debug信息进行通信。

node-inspector & ;node-debug app.js
出现下图所示就代表成功了。

调试方式二

node6.3+中, node --inspect app.js ,使用前开启chrome的Node debugging选项,出现下面效果标识就成功了。

说明 上述两种调试方式,我很少用,一般我都是用webstrome来调试,通过调整Node Interpreter的版本来使用相应的调试方式,原理和上面是一样的,只是调试形式上变化了下。

7以上我通常都是用 --inspect的方式,否则会提示你"node --debug is deprecated",但是用老方式也没什么问题。区别其实就是获取debug信息的通信协议方式不同,新的方式使用的是Chrome Debugging Protocol,而老的是 V8 Debugging Protoco。

总结

上面我只是总结了通用的异常情况,其实还有一些特殊的使用方式,例如throw在generator当中的使用,以及promise中可以直接抛出异常,都不是我上面所说的一般情况,不在列举,
因为阮老师关于这两个api的论述很详细,此处不在赘述。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83243.html

相关文章

  • 从JavaScript到Python之异常

    摘要:但如果忽视异常轻则影响功能运行,重则导致系统崩溃,造成经济损失。异常处理捕获异常捕获关键字与一致,都是使用。语句块表示无论是否发生异常,语句块代码一定会被执行。 不少前端工程师看到这个标题可能会产生质问: 我js用得好好的,能后端能APP,为什么还要学习Python? 至少有下面两个理由: 学习曲线。ES6之后的JavaScript(TypeScript)的在语法上和Python有很...

    xcold 评论0 收藏0
  • vue-cli+webpack开发流程总结

    摘要:加载百度地图后报错的,我们再加载一遍你的秘钥你的秘钥为当前时间戳获取方法 一、环境搭建 1、安装node.js在计算机中https://nodejs.org/en/download/ (此为node.js官方下载地址)安装完成后打开cmd命令提示符 node -v //查询node版本号 npm -v //查询npm版本号 2、如果npm使用网速跟不上...

    shiweifu 评论0 收藏0
  • Node 错误处理之挖坑系列

    摘要:一中的对象包含了错误的具体信息,包括错误堆栈等。不源码了,特别简单,自己去一下。 一. Error     JS 中的 Error 对象. 包含了错误的具体信息,包括 name、message、错误堆栈 stack 等。可以以 new Error 方式创建实例抛出,或调用 Error.captureStackTrace 为已有对象添加 stack 错误堆栈信息 而后抛出showImg(...

    afishhhhh 评论0 收藏0
  • Node.js + ELK 日志规范

    摘要:日志规范一般前端开发同学,对日志其实不太敏感,毕竟前端大多数情况下,不太关心日志。本文主要梳理了目前我们团队在开发中日志方面存在的问题,以及通过统一日志规范,希望达到什么样的效果。日志格式字段日志格式统一采用,便于解析处理。nodejs 日志规范 一般前端开发同学,对日志其实不太敏感,毕竟前端大多数情况下,不太关心日志。即使有,也可能调用一些第三方的统计,比如百度统计或者别的等。在 Node...

    tuomao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<