Node.js下自定义错误类型详解
前言
一般来说,很少人会考虑如何处理应用产生的错误的策略,调试的过程中,简单地利用console.log(‘error')定位错误,基本够用了,通过留下这些调试信息,能够为我们以后的调试过程中升了不少时间,提高了维护性。所以错误提示非常重要。同时,也会带来一些比较糟糕用法。最近的项目里就用到了自定义错误类型,觉得有必要深入了解一下,所以就写了这篇文章,方便自己和有需要的大家在需要的时候查阅。
SubclassingError
首先我们可以定义一个Error的子类。通过Object.create和util.inherits很容易实现:
varassert=require('assert'); varutil=require('util'); functionNotFound(msg){ Error.call(this); this.message=msg; } util.inherits(NotFound,Error); varerror=newNotFound('notfound'); assert(error.message); assert(errorinstanceofNotFound); assert(errorinstanceofError); assert.equal(errorinstanceofRangeError,false);
可以通过instanceof来检查错误类型,根据类型进行不同的处理。
上面的代码设置了自带的message,并且error是NotFound和Error的一个实例,但是不是RangeError。
如果用了express框架,就能设置其他的properties让error变得更有用。
比方说当处理一个HTTP的错误时,就可以写成这样:
functionNotFound(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)的错误构造函数来进行堆栈跟踪。
varNotFound=function(msg){ Error.call(this); Error.captureStackTrace(this,arguments.callee); this.message=msg||'NotFound'; this.statusCode=404; this.name="notFound" } util.inherits(NotFound,Error); export.NotFoundError=NotFound;
当然我们还可以将上面这个创建的抽象错误类型扩展到其他自定义错误中:
varnotFountError=require('./error').NotFountError; varUserNotFound=function(msg){ this.constructor.super_(msg); } util.inherits(UserNotFound,notFoundError);
总结
以上就是Node.js下自定义错误类型的全部内容,希望本文的内容对大家学习或者使用Node.js能有一定的帮助,如果有疑问大家可以留言交流。谢谢大家对毛票票的支持。