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 相关文章推荐
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
Nov 30 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
Feb 19 Javascript
详解JavaScript中setSeconds()方法的使用
Jun 11 Javascript
浅析jQuery Mobile的初始化事件
Dec 03 Javascript
JS中生成随机数的用法及相关函数
Jan 09 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
May 09 Javascript
node.js学习之交互式解释器REPL详解
Dec 08 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
Mar 24 Javascript
基于vue+canvas的excel-like组件实例详解
Nov 28 Javascript
javaScript中indexOf用法技巧
Nov 26 Javascript
JS removeAttribute()方法实现删除元素的某个属性
Jan 11 Javascript
JavaScript 数组去重详解
Sep 15 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 日期加减的类,很不错
2009/10/10 PHP
PHP 加密解密内部算法
2010/04/22 PHP
用PHP将数据导入到Foxmail的实现代码
2010/09/05 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
JavaScript Konami Code 实现代码
2009/07/29 Javascript
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
深入理解JavaScript 闭包究竟是什么
2013/04/12 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
js表单验证实例讲解
2016/03/31 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
JS之相等操作符详解
2016/09/13 Javascript
jQuery插件autocomplete使用详解
2017/02/04 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
JS图片预加载插件详解
2017/06/21 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
Python简明入门教程
2015/08/04 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
Python爬虫包BeautifulSoup简介与安装(一)
2018/06/17 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
python创造虚拟环境方法总结
2019/03/04 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
英国床垫在线:Mattress Online
2016/12/07 全球购物
年度考核自我鉴定
2014/02/02 职场文书
服装创业计划书范文
2014/02/05 职场文书
毕业生学校推荐信范文
2014/05/21 职场文书
班级标语大全
2014/06/21 职场文书
盲山观后感
2015/06/11 职场文书
2016先进集体事迹材料范文
2016/02/25 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
聘任书的格式及模板
2019/10/28 职场文书
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle
Go结合Gin导出Mysql数据到Excel表格
2022/08/05 Golang