理解node.js中的Error对象

Error对象在 node.js 程序中无处不在,但是关于它在 node.js文档 (写这篇文章时node.js的最新版本为v0.10.33)中却找不到描述资料,只在以下部分提及:

util.isError(object)
判断对象是否为Error对象.
Domain: Additions to Error objects
在Error对象上附加额外的字段.

Error到底是何方神圣?

Error对象是在ECMAScript 5.1(于2011年7月发布)中 定义 的,是一个比较新的特性:

Instances of Error objects are thrown as exceptions when runtime errors occur. The Error objects may also serve as base objects for user-defined exception classes.

它只有两个属性:

name
错误名称,默认为"Error"
message
错误消息,默认为""

V8实现了一个扩展属性:

stack
错误描述及调用堆栈

它只有一个方法:

toString
转成字符串形式,通常为 "name: message"

构造一个Error实例:

new Error(message) 或者 Error(message),两者是一样的。

示例:显示错误消息

console.log(err);
console.log(err.toString());
console.log(err.message);

需要注意的是console.log(JSON.stringify(err))显示的是空对象{}.

示例:显示错误消息及调用堆栈

console.log(err.stack);

示例:显示错误名称

console.log(err.name);

如何自定义Error类型?

function MyError(message) {
  this.message = message || '';
}

MyError.prototype = new Error();
MyError.prototype.constructor = MyError;
MyError.prototype.name = 'MyError';

Error实例类型判断

var err = new Error("this is error");
var myerr = new MyError("this is my error");
err instanceof Error /*true*/
err instanceof MyError /*false*/
myerr instanceof MyError /*true*/
myerr instanceof Error /*true*/

stack输出有问题:自定义的错误描述没了

err.stack /*'Error: this is error\n    at repl:1:11 ...*/
myerr.stack /*'MyError\n    at repl:1:21 ...*/

修复node.js下MyError的stack不正确的问题

function MyError(message) {
  Error.captureStackTrace(this, this.constructor)
  this.message = message || '';
}

MyError.prototype = new Error();
MyError.prototype.constructor = MyError;
MyError.prototype.name = 'MyError';

最终版:更node.js化一些

function MyError(message) {
    if (!(this instanceof MyError)) {
        return new MyError(message);
    }
    Error.captureStackTrace(this, this.constructor)
    this.message = message || '';
}

util.inherits(MyError, Error)
MyError.prototype.name = 'MyError';

参考

What is the error object?
对Error对象的成员有所提及,但与当前的node.js版本不一致。
Node.js下自定义错误类型
教你如何自定义错误类型。
What properties does nodejs express's Error object exposes?
讨论Error对象相关属性
MDN > Web technology for developers > JavaScript > JavaScript reference > Standard built-in objects > Error
Error对象参考文档
Error Objects
Error对象标准文档

node