错误对象是一种特殊的基本对象。它们拥有基本的 Error 类型,同时也有多种具体的错误类型。
标准文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects
-
Error
定义:通过Error的构造器可以创建一个错误对象。当运行时错误产生时,Error的实例对象会被抛出。Error对象也可用于用户自定义的异常的基础对象,Error.name的六种值对应的信息,即以下的Error -
官方案例
//抛出一个基本错误
通常你会使用throw关键字来抛出你创建的Error对象。可以使用 try...catch 结构来处理异常:
try {
throw new Error("Whoops!");
} catch (e) {
alert(e.name + ": " + e.message);
}
//处理一个特定错误
你可以通过判断异常的类型来特定处理某一类的异常,即判断 constructor 属性,当使用现代Javascript引擎时,可使用instanceof 关键字:
try {
foo.bar();
} catch (e) {
if (e instanceof EvalError) {
alert(e.name + ": " + e.message);
} else if (e instanceof RangeError) {
alert(e.name + ": " + e.message);
}
// ... etc
}
//自定义异常类型
你可能希望自定义基于Error的异常类型,使得你能够 throw new MyError() 并可以使用 instanceof MyError 来检查某个异常的类型. 这种需求的通用解决方法如下
// Create a new object, that prototypally inherits from the Error constructor.
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.name); // 'MyError'
console.log(e.message); // 'Default Message'
}
try {
throw new MyError('custom message');
} catch (e) {
console.log(e.name); // 'MyError'
console.log(e.message); // 'custom message'
}
-
AggregateError (集合误差)
定义:表示需要在一个错误中包装多个错误时的一个错误;当多个错误需要包装在一个错误中时,该对象表示一个错误。 -
官方案例
//新建AggregateError
try {
throw new AggregateError([
new Error("some error"),
], 'Hello');
} catch (e) {
console.log(e instanceof AggregateError); // true
console.log(e.message); // "Hello"
console.log(e.name); // "AggregateError"
console.log(e.errors); // [ Error: "some error" ]
}
//捕获AggregateError
Promise.any([
Promise.reject(new Error("some error")),
]).catch(e => {
console.log(e instanceof AggregateError); // true
console.log(e.message); // "All Promises rejected"
console.log(e.name); // "AggregateError"
console.log(e.errors); // [ Error: "some error" ]
});
- 学习用例
参考网站:https://www.bookstack.cn/read/es6-3rd/spilt.9.docs-promise.md
- EvalError
定义:代表了一个关于 eval 函数的错误.此异常不再会被JavaScript抛出,但是EvalError对象仍然保持兼容性
较新版本的JavaScript不会抛出EvalError,改为SyntaxError - 官方案例
//创建EvalError
try {
throw new EvalError('Hello', 'someFile.js', 10);
} catch (e) {
console.log(e instanceof EvalError); // true
console.log(e.message); // "Hello"
console.log(e.name); // "EvalError"
console.log(e.fileName); // "someFile.js"
console.log(e.lineNumber); // 10
console.log(e.columnNumber); // 0
console.log(e.stack); // "@Scratchpad/2:2:9\n"
}
- RangeError
定义:标明一个错误,当一个值不在其所允许的范围或者集合中 - 官方案例
//创建RangeError
var check = function(num) {
if (num < MIN || num > MAX) {
throw new RangeError('Parameter must be between ' + MIN + ' and ' + MAX);
}
};
try {
check(500);
}
catch (e) {
if (e instanceof RangeError) {
// 处理越界错误
}
}
- 学习用例
var num = 1;
try {
num.toPrecision(500); // 一个数字不能有500位有效数字
}
catch(err) {
console.log(err.name);
}
结果:RangeError
- ReferenceError
定义:代表当一个不存在的变量被引用时发生的错误 - 官方案例
//捕获Reference
try {
var a = undefinedVariable;
} catch (e) {
console.log(e instanceof ReferenceError); // true
console.log(e.message); // "undefinedVariable is not defined"
console.log(e.name); // "ReferenceError"
console.log(e.fileName); // "Scratchpad/1"
console.log(e.lineNumber); // 2
console.log(e.columnNumber); // 6
console.log(e.stack); // "@Scratchpad/2:2:7\n"
}
//创建ReferenceError
try {
throw new ReferenceError('Hello', 'someFile.js', 10);
} catch (e) {
console.log(e instanceof ReferenceError); // true
console.log(e.message); // "Hello"
console.log(e.name); // "ReferenceError"
console.log(e.fileName); // "someFile.js"
console.log(e.lineNumber); // 10
console.log(e.columnNumber); // 0
console.log(e.stack); // "@Scratchpad/2:2:9\n"
}
- 学习用例
var x;
try {
x = y + 1; // y无法引用(使用)
}
catch(err) {
console.log(err.name);
}
结果:ReferenceError
- SyntaxError
定义:对象代表尝试解析语法上不合法的代码的错误 - 当Javascript语言解析代码时,Javascript引擎发现了不符合语法规范的tokens或token顺序时抛出SyntaxError
- 官方案例
//捕获 SyntaxError
try {
eval('hoo bar');
} catch (e) {
console.log(e instanceof SyntaxError); // true
console.log(e.message); // "missing ; before statement"
console.log(e.name); // "SyntaxError"
console.log(e.fileName); // "Scratchpad/1"
console.log(e.lineNumber); // 1
console.log(e.columnNumber); // 4
console.log(e.stack); // "@Scratchpad/1:2:3\n"
}
//创建 SyntaxError
try {
throw new SyntaxError('Hello', 'someFile.js', 10);
} catch (e) {
console.log(e instanceof SyntaxError); // true
console.log(e.message); // "Hello"
console.log(e.name); // "SyntaxError"
console.log(e.fileName); // "someFile.js"
console.log(e.lineNumber); // 10
console.log(e.columnNumber); // 0
console.log(e.stack); // "@Scratchpad/2:11:9\n"
}
- 学习用例
try {
eval("alert('Hello)"); // 缺少'会产生错误 'Hello 不是完整的字符串 'Hello' 因此报错
}
catch(err) {
console.log(err.name);
}
结果:SyntaxError
- TypeError
定义:对象用来表示值的类型非预期类型时发生的错误 - 官方案例
//捕获TypeError
try {
null.f();
} catch (e) {
console.log(e instanceof TypeError); // true
console.log(e.message); // "null has no properties"
console.log(e.name); // "TypeError"
console.log(e.fileName); // "Scratchpad/1"
console.log(e.lineNumber); // 2
console.log(e.columnNumber); // 2
console.log(e.stack); // "@Scratchpad/2:2:3\n"
}
//创建TypeError
try {
throw new TypeError('Hello', "someFile.js", 10);
} catch (e) {
console.log(e instanceof TypeError); // true
console.log(e.message); // "Hello"
console.log(e.name); // "TypeError"
console.log(e.fileName); // "someFile.js"
console.log(e.lineNumber); // 10
console.log(e.columnNumber); // 0
console.log(e.stack); // "@Scratchpad/2:2:9\n"
}
- 学习用例
var num = 1;
try {
num.toUpperCase(); // 您无法将数字转换为大写
}
catch(err) {
console.log(err.name);
}
结果: TypeError
- URLError
定义:URIError 对象用来表示以一种错误的方式使用全局URI处理函数而产生的错误 - 官方案例
//捕获URIError
try {
decodeURIComponent('%');
} catch (e) {
console.log(e instanceof URIError); // true
console.log(e.message); // "malformed URI sequence"
console.log(e.name); // "URIError"
console.log(e.fileName); // "Scratchpad/1"
console.log(e.lineNumber); // 2
console.log(e.columnNumber); // 2
console.log(e.stack); // "@Scratchpad/2:2:3\n"
}
//创建URIError
try {
throw new URIError('Hello', 'someFile.js', 10);
} catch (e) {
console.log(e instanceof URIError); // true
console.log(e.message); // "Hello"
console.log(e.name); // "URIError"
console.log(e.fileName); // "someFile.js"
console.log(e.lineNumber); // 10
console.log(e.columnNumber); // 0
console.log(e.stack); // "@Scratchpad/2:2:9\n"
}
- 学习用例
try {
decodeURI("%%%"); // 您不能URI解码百分号 如果在URI函数中使用非法字符,则抛出URIError
}
catch(err) {
console.log(err.name);
}
结果:URIError
具体可以参考标准内置对象 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Error
最近看到一篇帖子,关于这方面的问题,分享给大家 https://mp.weixin.qq.com/s/FbMv8YH6AVHxCeBYE1NzRw