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 相关文章推荐
javascript实现的基于金山词霸网络翻译的代码
Jan 15 Javascript
JavaScript XML和string相互转化实现代码
Jul 04 Javascript
实现只能输入数字的input不用replace方法
Sep 12 Javascript
jQuery基于当前元素进行下一步的遍历
May 20 Javascript
简介JavaScript中toUpperCase()方法的使用
Jun 06 Javascript
浅析js中substring和substr的方法
Nov 09 Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
Jun 06 Javascript
利用浮层使select不可选的实现方法
Dec 03 Javascript
简单谈谈gulp-changed插件
Feb 21 Javascript
了解VUE的render函数的使用
Jun 08 Javascript
使用vue如何构建一个自动建站项目
Feb 05 Javascript
Webpack打包字体font-awesome的方法示例
Apr 26 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
解析htaccess伪静态的规则
2013/06/18 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
Javascript原型链的原理详解
2016/01/05 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
Angular路由简单学习
2016/12/26 Javascript
javascript常用的设计模式
2017/02/09 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
redux中间件之redux-thunk的具体使用
2018/04/17 Javascript
vue如何将v-for中的表格导出来
2018/05/07 Javascript
VUE DOM加载后执行自定义事件的方法
2018/09/07 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
[02:06]DOTA2英雄基础教程 暗影萨满
2013/12/16 DOTA
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
Python操作串口的方法
2015/06/17 Python
Django基础之Model操作步骤(介绍)
2017/05/27 Python
pandas重新生成索引的方法
2018/11/06 Python
python实现词法分析器
2019/01/31 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
Python flask路由间传递变量实例详解
2020/06/03 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
python爬虫要用到的库总结
2020/07/28 Python
自荐信格式技巧有哪些呢
2013/11/19 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
无线电通信名词解释
2022/02/18 无线电