前言
一般来说,很少人会考虑如何处理应用产生的错误的策略,调试的过程中,简单地利用
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)









