异常类型
JS的异常报错类型
- Error
所有错误对象的基类。自己也可以直接
throw new Error('msg')产生自定义错误。 - SyntaxError
代码在解析阶段不符合语法规则。
例:
eval('1 +')抛出SyntaxError: Unexpected token ')' - ReferenceError 访问了不存在的变量 / 词法绑定。 例:console.log(foo) 而 foo 未声明。
- TypeError
值的类型不符合预期或对象内部方法/属性不可调用。
例:
null.f() 或 Object.create(undefined)。 - RangeError
数值超出合法范围。
例:
new Array(-1) 或 (10).toString(37)(基数必须在 2–36)。 - URIError encodeURI、decodeURI、encodeURIComponent、decodeURIComponent 失败。 例:decodeURI('%') 抛出 URIError: URI malformed。
- EvalError 早期用于表示 eval() 使用不当(如严格模式下给 eval 赋值)。现代实现几乎不再抛出,仅保留兼容性。
- AggregateError 多个错误需要聚合为一个错误时抛出,最常见于 Promise.any() 全部拒绝。
JS如何捕获异步任务异常(除了.then().catch())
- try…catch + async/await:
javascript async function run() { try { await someAsync(); } catch (e) { console.error(e); } }
全局兜底:
– window.addEventListener('error', ...)(普通脚本/资源)
– window.addEventListener('unhandledrejection', ...)(Promise 未捕获)
/***********************
* 1. 捕获普通运行时错误 *
***********************/
window.addEventListener('error', function (event) {
// event.filename / lineno / colno / error 等字段可用
console.error('[全局 error]', event.error || event.message);
// 返回 true 表示“已处理”,浏览器控制台不再重复输出
return true;
});
/*************************
* 2. 捕获资源加载错误 *
* <img>/<script>/<link> *
*************************/
window.addEventListener('error', function (event) {
// 运行时错误 event.target === window
// 资源加载错误 event.target 是 <img>/<script>/...
if (event.target !== window) {
console.error('[资源加载失败]', event.target.tagName, event.target.src || event.target.href);
return true;
}
}, true); // 捕获阶段,确保能拦截资源错误
/*************************
* 3. 捕获未处理 Promise *
*************************/
window.addEventListener('unhandledrejection', function (event) {
console.error('[未处理 Promise]', event.reason);
// 阻止默认控制台输出
event.preventDefault();
});
/****** 下面制造一些错误,用来验证 ******/
// 3.1 宏任务里抛错
setTimeout(() => {
throw new Error('宏任务中的错误');
});
// 3.2 未处理的 Promise 拒绝
Promise.reject(new Error('Promise 未捕获'));