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下获取object(ActiveX)的Param的代码
Sep 15 Javascript
jQuery 使用手册(三)
Sep 23 Javascript
JS图片无缝滚动(简单利于使用)
Jun 17 Javascript
from表单多个按钮提交用onclick跳转不同action
Apr 24 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
Dec 01 Javascript
JavaScript对Json的增删改属性详解
Jun 02 Javascript
easyui-datagrid开发实践(总结)
Aug 02 Javascript
10 种最常见的 Javascript 错误(频率最高)
Feb 08 Javascript
AngularJS与BootStrap模仿百度分页的示例代码
May 23 Javascript
Vue实现移动端页面切换效果【推荐】
Nov 13 Javascript
countUp.js实现数字动态变化效果
Oct 17 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
Aug 03 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.MVC的模板标签系统(五)
2006/09/05 PHP
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
PHP 字符串 小常识
2009/06/05 PHP
解析curl提交GET,POST,Cookie的简单方法
2013/06/29 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
2016/11/23 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
jQuery 版本的文本输入框检查器Input Check
2009/07/09 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
javascript实用方法总结
2015/02/06 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
angular分页指令操作
2017/01/09 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
读懂CommonJS的模块加载
2019/04/19 Javascript
jQuery Ajax async=>false异步改为同步时,解决导致浏览器假死的问题
2019/07/22 jQuery
关于Node.js中频繁修改代码重启服务器的问题
2020/10/15 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
浅析python 中__name__ = '__main__' 的作用
2014/07/05 Python
python写入已存在的excel数据实例
2018/05/03 Python
Python发送邮件测试报告操作实例详解
2018/12/08 Python
机器学习实战之knn算法pandas
2019/06/22 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
如何处理简单的PHP错误
2015/10/14 面试题
如何强制垃圾回收
2015/10/06 面试题
《云房子》教学反思
2014/04/20 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python