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库与其他JS库冲突的解决办法
Feb 07 Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
May 07 Javascript
JavaScript Promise启示录
Aug 12 Javascript
JavaScript中的类与实例实现方法
Jan 23 Javascript
JavaScript内存管理介绍
Mar 13 Javascript
js实现向右横向滑出的二级菜单效果
Aug 27 Javascript
Bootstrap开关(switch)控件学习笔记分享
May 30 Javascript
react-native中ListView组件点击跳转的方法示例
Sep 30 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
Sep 17 Javascript
小程序转发探索示例
Feb 19 Javascript
微信小程序封装的HTTP请求示例【附升级版】
May 11 Javascript
详解vue中$nextTick和$forceUpdate的用法
Dec 11 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
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
zf框架的Filter过滤器使用示例
2014/03/13 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
PHP实现小程序批量通知推送
2018/11/27 PHP
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
js实现浏览器倒计时跳转页面效果
2016/08/12 Javascript
JS实现微信摇一摇原理解析
2017/07/22 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
web页面和微信小程序页面实现瀑布流效果
2018/09/26 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
Python面向对象class类属性及子类用法分析
2018/02/02 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
python多线程同步实例教程
2019/08/11 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
Timberland法国官网:购买靴子、鞋子、衣服、夹克和配饰
2019/11/30 全球购物
酒店管理自荐信
2013/10/23 职场文书
庆八一活动方案
2014/01/25 职场文书
科长竞争上岗演讲稿
2014/05/12 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
出生证明格式
2015/06/15 职场文书
教育读书笔记
2015/07/02 职场文书
数学备课组工作总结
2015/08/12 职场文书
Python可视化学习之seaborn绘制矩阵图详解
2022/02/24 Python
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL