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 相关文章推荐
JS 屏蔽按键效果与改变按键效果的示例代码
Dec 24 Javascript
js拖拽一些常见的思路方法整理
Mar 19 Javascript
JQuery实现动态适时改变字体颜色的方法
Mar 10 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
May 03 Javascript
javascript图片延迟加载实现方法及思路
Dec 31 Javascript
基于bootstrap风格的弹框插件
Dec 28 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
May 08 Javascript
在 webpack 中使用 ECharts的实例详解
Feb 05 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
Apr 24 Javascript
深入剖析JavaScript instanceof 运算符
Jun 14 Javascript
深度解读vue-resize的具体用法
Jul 08 Javascript
如何在JavaScript中正确处理变量
Dec 25 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
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
php5 pdo新改动加载注意事项
2008/09/11 PHP
PHP 程序员应该使用的10个组件
2009/10/31 PHP
php allow_url_include的应用和解释
2010/04/22 PHP
MySQL连接数超过限制的解决方法
2011/07/17 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
jquery的live使用注意事项
2014/02/18 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
jQuery实现内容定时切换效果完整实例
2016/04/06 Javascript
JavaScript事件详细讲解
2016/06/27 Javascript
Node.js学习之地址解析模块URL的使用详解
2017/09/28 Javascript
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
python实现爬虫下载美女图片
2015/07/14 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
Python 修改列表中的元素方法
2018/06/26 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
python制作mysql数据迁移脚本
2019/01/01 Python
快速排序的四种python实现(推荐)
2019/04/03 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
python循环输出三角形图案的例子
2019/11/22 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
英国户外装备商店:Ultimate Outdoors
2019/05/07 全球购物
新驾驶员个人自我评价
2014/01/03 职场文书
销售辞职报告范文
2014/01/12 职场文书
乡下人家教学反思
2014/02/01 职场文书
学校文明单位申报材料
2014/05/06 职场文书
计划生育证明书写要求
2014/09/17 职场文书
大国崛起英国观后感
2015/06/02 职场文书
小学英语教学反思范文
2016/02/15 职场文书