古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼
自定义异常类型
如果 JavaScript 提供的异常类型不能够满足我们,我们可以自定义属于自己的异常类型,这个自定义的异常类型一般都是继承 Error 的异常类型,而且可以通过 instanceof
关键字来表示属于那种异常类型。
先来看一下 Node.js 中提供的用于自定义异常类型所提供的属性和方法,如下所示
error.stack
属性:返回一个字符串,字符串的第一行会被格式化为<error class name>: <error message>
,且带上一系列栈帧(每一行都以 "at " 开头)。 每一帧描述了一个代码中导致错误生成的调用点。Error.captureStackTrace(targetObject[, constructorOpt])
方法:targetObject
表示一个对象,constructorOpt
表示对象的构造函数。作用:在targetObject
上创建一个.stack
属性
示例代码如下
function MyError(message) {
this.message = message
this.name = 'MyError'
/*
* Error.captureStackTrace(targetObject[, constructorOpt])
* 参数 targetObject -> 表示一个对象
* 参数 constructorOpt -> 表示对象的构造函数
* 在targetObject上创建一个.stack属性, 调用是返回一个调用 Error.captureStackTrace() 的位置的字符串。
*/
Error.captureStackTrace(this, MyError)
}
// 使自定义的错误类型与父级的原型链断开
MyError.prototype = Object.create(Error.prototype);
MyError.prototype.constructor = MyError;
// * 在node.js 环境中 new Error 会直接抛出异常 不适用于 node.js环境
// function MyError(message) {
// this.name = 'MyError';
// this.message = message || 'Default Message';
// this.stack = (new Error()).stack;
// }
// MyError.prototype = Object.create(Error.prototype);
// MyError.prototype.constructor = MyError;
try {
throw new MyError('错了');
} catch (e) {
console.log(e);
}
MyError
的原型链如下所示: