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 相关文章推荐
Jquery动态进行图片缩略的原理及实现
Aug 13 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
Sep 16 Javascript
js去除空格的12种实用方法
Nov 08 Javascript
简单学习JavaScript中的for语句循环结构
Nov 10 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
Nov 29 Javascript
用move.js库实现百叶窗特效
Feb 08 Javascript
JavaScript中的一些隐式转换和总结(推荐)
Dec 22 Javascript
webpack公共组件引用路径简化小技巧
Jun 15 Javascript
用Fundebug插件记录网络请求异常的方法
Feb 21 Javascript
解决vue 单文件组件中样式加载问题
Apr 24 Javascript
基于Node.js的大文件分片上传示例
Jun 19 Javascript
写给新手同学的vuex快速上手指北小结
Apr 14 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制作图型计数器的例子
2006/10/09 PHP
解析PHP高效率写法(详解原因)
2013/06/20 PHP
Yii分页用法实例详解
2014/12/04 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
js宝典学习笔记(上)
2007/01/10 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
2013/08/02 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
浅谈javascript的调试
2015/01/28 Javascript
关于延迟加载JavaScript
2015/05/05 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
jqueryUI tab标签页代码分享
2017/10/09 jQuery
动态加载JavaScript文件的3种方式
2018/05/05 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
Python读写unicode文件的方法
2015/07/10 Python
python中defaultdict的用法详解
2017/06/07 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
python实现dijkstra最短路由算法
2019/01/17 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
python实现门限回归方式
2020/02/29 Python
纯css3(无图片/js)制作的几个社交媒体网站的图标
2013/03/21 HTML / CSS
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
内部类的定义、种类以及优点
2013/10/16 面试题
探矿工程师自荐信
2014/01/24 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
基层党建工作汇报材料
2014/08/15 职场文书
夫妻双方自愿离婚协议书怎么写
2014/12/01 职场文书
2015年第十五个全民国防教育日宣传活动方案
2015/05/06 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby
Springboot中如何自动转JSON输出
2022/06/16 Java/Android
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android