异常的触发
throw 语句手动抛出
throw expression;
expression可以是字符串、布尔值、数字或对象值。
// 用户定义的 throw 语句 --- 通用错误
throw new Error('The number is low');
// 用户定义的throw 语句 --- 引用错误
throw new ReferenceError('this is reference error');
JavaScript 运行时自动抛出
异常的捕获
手动捕获 try catch
try {
// 执行目标代码
} catch (err) {
// 控制台打印报错信息
console.log(err);
} finally {
// 无论是否报错都会执行的代码
}
实战范例
const number = 5;
try {
// 用户定义的throw语句
throw new Error('This is the throw');
}
catch(error) {
console.log('捕获到一个错误');
if( number + 8 > 10) {
// 处理异常的语句
console.log('错误信息:' + error);
console.log('错误已解决');
}
else {
// 无法处理异常
// 重新抛出异常
throw new Error('The value is low');
}
}
执行结果
捕获到一个错误
错误信息:Error: This is the throw
错误已解决
catch 代码块处理了异常,没有发生错误,因此,throw语句不会被重新抛出。
自动捕获
window.onerror = function (message, source, lineno, colno, error) {
// 解析报错信息
};
可全局监听所有JS的报错
- message:错误消息(字符串)
- source:引发错误的脚本的URL(字符串)
- lineno:发生错误的行号(数值)
- colno:发生错误的行的列号(数值)
- error:错误对象(对象)
缺点:
- 对跨域的 js ,如 CDN 的,不会有详细的报错信息
- 对于压缩的 js ,需要配合 sourceMap 反查到未压缩代码的行、列
异常的处理
- 给出适当的错误提示
- 回退到备用方案
- 记录错误日志
常见的异常
异常有多种类型,都是 JS 内置的构造函数,可通过 new 创建对应的异常对象实例,如
// 用户定义的 throw 语句 --- 通用错误
throw new Error('The number is low');
Error 错误
JavaScript 中最基本的异常类型,其他异常类型都继承自 Error
SyntaxError 语法错误
代码中存在语法错误时抛出。例如,括号未正确匹配、缺少分号等
遇到语法错误时,JavaScript 解析器无法理解代码,因此会抛出 SyntaxError 异常。
避错方案:使用开发工具中的代码高亮和错误提示来帮助识别和解决语法错误。
TypeError 类型错误
使用了错误的数据类型或对某个值执行了不支持的操作时抛出。例如,对 undefined 或 null 值进行属性访问、调用非函数对象等。
避错方案:确保变量和对象具有正确的类型,并使用条件语句或强制类型转换来避免类型不匹配的操作
ReferenceError 引用错误
引用了不存在的变量或函数时抛出。例如,访问未声明的变量或函数。
console.log(x); // ReferenceError: x is not defined
避错方案:确保所有引用的变量、函数和属性都已经声明或存在,避免在作用域外部引用变量,并注意检查对象的属性是否存在。
RangeError 范围错误
使用了超出有效范围的值时抛出。例如,使用了超出数组边界的索引、传递了超出函数参数有效范围的值等。
var arr = [1, 2, 3];
console.log(arr[5]); // RangeError: Index out of range 数组下标越界
避错方案:确保数组索引和数字值在有效范围内,避免无限循环和超出有效范围的操作。在使用内置对象(如日期)时,确保传递的参数在有效范围内。
URIError(URI 错误)
处理 URI 相关的操作时抛出
AggregateError 聚合错误
AggregateError 是在多个错误被捕获时封装了这些错误的对象。
EvalError(eval 错误)【已废弃】
使用 eval() 函数时发生错误时抛出
EvalError 在现代的 JavaScript 中已经被废弃,因此不建议在代码中使用它。