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:以前写的xmlhttp池,代码
May 18 Javascript
基于JQuery框架的AJAX实例代码
Nov 03 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
May 30 Javascript
用Javascript获取页面元素的具体位置
Dec 09 Javascript
jQuery插件kinMaxShow扩展效果用法实例
May 04 Javascript
JS面试题---关于算法台阶的问题
Jul 26 Javascript
纯JavaScript手写图片轮播代码
Oct 20 Javascript
对Angular.js Controller如何进行单元测试
Oct 25 Javascript
基于jquery实现多选下拉列表
Aug 02 jQuery
Vue实现底部侧边工具栏的实例代码
Sep 03 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
Sep 10 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
Jul 14 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/07/12 PHP
PHP+DBM的同学录程序(4)
2006/10/09 PHP
php include的妙用,实现路径加密
2008/07/29 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
教你如何使用php session
2013/10/28 PHP
PHP同时连接多个mysql数据库示例代码
2014/03/17 PHP
Linux中为php配置伪静态
2014/12/17 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
Date对象格式化函数代码
2010/07/17 Javascript
JS与C#编码解码
2013/12/03 Javascript
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
2015/09/16 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
详解Javascript函数声明与递归调用
2016/10/22 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
又拍云 Node.js 实现文件上传、删除功能
2018/10/28 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
vue将data恢复到初始状态 && 重新渲染组件实例
2020/09/04 Javascript
python实现NB-IoT模块远程控制
2018/06/20 Python
python读取Excel实例详解
2018/08/17 Python
python/golang 删除链表中的元素
2020/09/14 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
CSS3 文字动画效果
2020/11/12 HTML / CSS
革命先烈的英雄事迹材料
2014/02/15 职场文书
采购经理岗位职责
2014/02/16 职场文书
计算机学生的自我评价分享
2014/02/18 职场文书
大学毕业生管理学求职信
2014/09/01 职场文书
就业协议书怎么填
2014/09/15 职场文书
六年级学生评语大全
2014/12/26 职场文书
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript