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 模拟实现类似c#下的hashtable的简单功能代码
Jan 24 Javascript
javascript实现的像java、c#之类的sleep暂停的函数代码
Mar 04 Javascript
js单例模式详解实例
Nov 21 Javascript
js控制网页前进和后退的方法
Jun 08 Javascript
JavaScript检查子字符串是否在字符串中的方法
Feb 03 Javascript
一个简易的js图片轮播效果
Jul 22 Javascript
vue + vuex todolist的实现示例代码
Mar 09 Javascript
解决Angular2 router.navigate刷新页面的问题
Aug 31 Javascript
Vue项目实现简单的权限控制管理功能
Jul 17 Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
Apr 15 Javascript
angular组件间传值测试的方法详解
May 07 Javascript
JavaScript 异步时序问题
Nov 20 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
第十一节--重载
2006/11/16 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
JS中setTimeout()的用法详解
2013/04/14 Javascript
鼠标划过实现延迟加载并隐藏层的js代码
2013/10/11 Javascript
js实现日历的简单算法
2017/01/24 Javascript
angularjs指令之绑定策略(@、=、&)
2017/04/13 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
2018/12/16 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
微信小程序实现滑动操作代码
2020/04/23 Javascript
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
用python写的一个wordpress的采集程序
2016/02/27 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
出纳岗位职责
2013/11/09 职场文书
计算机求职信
2013/12/01 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
员工安全责任书范本
2014/07/24 职场文书
环卫工人节活动总结
2014/08/29 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
MySQL 时间类型的选择
2021/06/05 MySQL
总结python多进程multiprocessing的相关知识
2021/06/29 Python
使用springMVC所需要的pom配置
2021/09/15 Java/Android
MySQL导致索引失效的几种情况
2022/06/25 MySQL