Node.js下自定义错误类型详解


Posted in Javascript onOctober 17, 2016

前言

一般来说,很少人会考虑如何处理应用产生的错误的策略,调试的过程中,简单地利用console.log(‘error')定位错误,基本够用了,通过留下这些调试信息,能够为我们以后的调试过程中升了不少时间,提高了维护性。所以错误提示非常重要。同时,也会带来一些比较糟糕用法。最近的项目里就用到了自定义错误类型,觉得有必要深入了解一下,所以就写了这篇文章,方便自己和有需要的大家在需要的时候查阅。

Subclassing Error

首先我们可以定义一个 Error 的子类。通过 Object.create util.inherits 很容易实现:

var assert = require('assert');
var util = require('util');

function NotFound(msg){
 Error.call(this);
 this.message = msg;
}
util.inherits(NotFound, Error);
var error = new NotFound('not found');
assert(error.message);
assert(error instanceof NotFound);
assert(error instanceof Error);
assert.equal(error instanceof RangeError, false);

可以通过 instanceof 来检查错误类型,根据类型进行不同的处理。

上面的代码设置了自带的message, 并且 error NotFound Error 的一个实例, 但是不是 RangeError

如果用了 express 框架, 就能设置其他的 properties error 变得更有用。

比方说当处理一个HTTP的错误时, 就可以写成这样:

function NotFound(msg) {
 Error.call(this);
 this.message = msg;
 this.statusCode = 404;
}

现在就已经可以通过错误处理的中间件来处理错误信息:

app.use(function(err, req, res, next) {
 console.error(err.stack);

 if (!err.statusCode || err.statusCode === 500) {
 emails.error({ err: err, req: req });
 }

 res.send(err.statusCode || 500, err.message);
});

这会发送HTTP的状态码给浏览器, 当 err statusCode 未设置或者等于 500 的时候, 就通过邮件来发送这个错误。这样就能排除那些 404, 401, 403等等的错误。

读取 console.error(err.stack) 事实上并不会像预期那样工作,像 node, chrome 基于 V8 的可以使用 Error.captureStackTrace(this, arguments.callee) 的错误构造函数来进行堆栈跟踪。

var NotFound = function(msg) {
 Error.call(this);
 Error.captureStackTrace(this, arguments.callee);
 this.message = msg || 'Not Found';
 this.statusCode = 404;
 this.name = "notFound"
}
util.inherits(NotFound, Error);

export.NotFoundError = NotFound;

当然我们还可以将上面这个创建的抽象错误类型扩展到其他自定义错误中:

var notFountError = require('./error').NotFountError; 
var UserNotFound = function(msg){
 this.constructor.super_(msg);
}

util.inherits(UserNotFound, notFoundError);

总结

以上就是Node.js下自定义错误类型的全部内容,希望本文的内容对大家学习或者使用Node.js能有一定的帮助,如果有疑问大家可以留言交流。谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
最新28个很棒的jQuery 教程
May 28 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
Feb 07 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
Feb 11 Javascript
使用GruntJS构建Web程序之合并压缩篇
Jun 06 Javascript
让人蛋疼的JavaScript语法特性
Sep 30 Javascript
JavaScript中的slice()方法使用详解
Jun 06 Javascript
JS只能输入正整数的简单实例
Oct 07 Javascript
javascript数组定义的几种方法
Oct 06 Javascript
在Vant的基础上封装下拉日期控件的代码示例
Dec 05 Javascript
jquery实现弹窗(系统提示框)效果
Dec 10 jQuery
js实现抽奖功能
Nov 24 Javascript
微信小程序视频弹幕发送功能的实现
Dec 28 Javascript
js HTML5多媒体影音播放
Oct 17 #Javascript
基于JavaScript实现前端文件的断点续传
Oct 17 #Javascript
js html5 css俄罗斯方块游戏再现
Oct 17 #Javascript
Node.js包管理器Yarn的入门介绍与安装
Oct 17 #Javascript
深入理解JS实现快速排序和去重
Oct 17 #Javascript
JavaScript中关键字 in 的使用方法详解
Oct 17 #Javascript
Angular 2应用的8个主要构造块有哪些
Oct 17 #Javascript
You might like
一篇有意思的技术文章php介绍篇
2010/10/26 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
php遍历树的常用方法汇总
2015/06/18 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
javascript:void(0)是什么意思及href=#与href=javascriptvoid(0)的区别
2015/11/13 Javascript
node.js实现端口转发
2016/04/14 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
2020/07/22 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
Python使用gensim计算文档相似性
2016/04/10 Python
django2 快速安装指南分享
2018/01/05 Python
Python自定义一个异常类的方法
2019/06/27 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
美国儿童运动鞋和服装零售商:Kids Foot Locker
2017/08/05 全球购物
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
数据员岗位职责
2013/11/19 职场文书
店长岗位职责
2013/11/21 职场文书
医药代表个人的求职信分享
2013/12/08 职场文书
毕业生自荐书模版
2014/01/04 职场文书
小学师德师风演讲稿
2014/09/02 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
队名及霸气口号大全
2015/12/25 职场文书