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对象标准文档