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 相关文章推荐
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
Dec 02 Javascript
复选框全选与全不选操作实现思路
Aug 18 Javascript
js使下拉列表框可编辑不止是选择
Dec 12 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
Oct 28 Javascript
AngularJS实现表单验证功能
Jan 09 Javascript
AngularJS之自定义服务详解(factory、service、provider)
Apr 14 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
Jun 11 jQuery
JavaScript数组push方法使用注意事项
Oct 30 Javascript
详解swipe使用及竖屏页面滚动方法
Jun 28 Javascript
vue中使用[provide/inject]实现页面reload的方法
Sep 30 Javascript
node+multer实现图片上传的示例代码
Feb 18 Javascript
vue中利用three.js实现全景图的完整示例
Dec 07 Vue.js
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的博客ping服务代码
2012/02/04 PHP
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
JavaScript去除空格的几种方法
2006/10/03 Javascript
DOM 脚本编程中的兄弟节点
2009/10/31 Javascript
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
JS+CSS实现仿新浪微博搜索框的方法
2015/02/24 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
python3.0 字典key排序
2008/12/24 Python
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
安装Python的web.py框架并从hello world开始编程
2015/04/25 Python
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
Python实现时钟显示效果思路详解
2018/04/11 Python
分享vim python缩进等一些配置
2018/07/02 Python
基于python爬取有道翻译过程图解
2020/03/31 Python
python 在sql语句中使用%s,%d,%f说明
2020/06/06 Python
解决pytorch 模型复制的一些问题
2021/03/03 Python
css3 按钮 利用css3实现超酷下载按钮
2013/03/18 HTML / CSS
详解css position 5种不同的值的用法
2019/07/30 HTML / CSS
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
德国、奥地利和瑞士最大的旅行和度假门户网站:HolidayCheck
2019/11/14 全球购物
会议邀请函范文
2014/01/09 职场文书
KTV员工管理制度
2015/08/06 职场文书
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫