JavaScript错误对象研究及基本介绍02:ReferenceError、SyntaxError、TypeError、URIError
在JavaScript开发过程中,我们经常会遇到各种各样的错误。理解这些错误的类型和特性,对于调试和编写健壮的代码至关重要。在上一篇文章中,我们介绍了 Error
、AggregateError
、EvalError
和 RangeError
。本篇文章将继续探讨 JavaScript 中的其他常见错误对象,包括:
- ReferenceError
- SyntaxError
- TypeError
- URIError
通过对这些错误对象的深入研究,我们将了解它们的产生原因、特性,以及如何有效地捕获和处理它们。
一、ReferenceError 对象
1. 基本介绍
ReferenceError
对象在尝试引用一个未声明的变量或作用域中不存在的变量时抛出。它表示在引用(访问)一个不存在的变量时发生的错误。
2. 语法
new ReferenceError([message[, fileName[, lineNumber]]])
- message(可选):描述错误的字符串。
- fileName(可选):发生错误的文件名(非标准,浏览器特定)。
- lineNumber(可选):发生错误的行号(非标准,浏览器特定)。
3. 示例代码
示例1:引用未声明的变量
try {
console.log(nonExistentVariable);
} catch (e) {
console.error(e.name + ': ' + e.message);
}
// 输出: ReferenceError: nonExistentVariable is not defined
示例2:作用域问题
function testScope() {
try {
console.log(innerVariable);
let innerVariable = 5;
} catch (e) {
console.error(e.name + ': ' + e.message);
}
}
testScope();
// 输出: ReferenceError: Cannot access 'innerVariable' before initialization
二、SyntaxError 对象
1. 基本介绍
SyntaxError
对象在解析代码时发生语法错误时抛出。它表示代码在语法上不符合 JavaScript 语言规范,无法被解析。
2. 语法
new SyntaxError([message[, fileName[, lineNumber]]])
3. 示例代码
示例1:缺少括号
try {
eval('function test() { console.log("Hello" }');
} catch (e) {
console.error(e.name + ': ' + e.message);
}
// 输出: SyntaxError: Unexpected token '}'
示例2:意外的标识符
try {
eval('var 1num = 5;');
} catch (e) {
console.error(e.name + ': ' + e.message);
}
// 输出: SyntaxError: Unexpected number
三、TypeError 对象
1. 基本介绍
TypeError
对象在变量或参数不是预期类型时抛出,或者当使用的值不符合预期类型时发生错误。
2. 语法
new TypeError([message[, fileName[, lineNumber]]])
3. 示例代码
示例1:对非函数类型调用
try {
var num = 5;
num();
} catch (e) {
console.error(e.name + ': ' + e.message);
}
// 输出: TypeError: num is not a function
示例2:读取未定义的属性
try {
var obj = null;
console.log(obj.property);
} catch (e) {
console.error(e.name + ': ' + e.message);
}
// 输出: TypeError: Cannot read property 'property' of null
示例3:对非对象设置属性
try {
var num = 5;
num.property = 'value';
} catch (e) {
console.error(e.name + ': ' + e.message);
}
// 在严格模式下,会抛出 TypeError
if (obj && obj.property) {
// 安全地访问 obj.property
}
四、URIError 对象
1. 基本介绍
URIError
对象在全局的 URI 处理函数(decodeURI
、decodeURIComponent
、encodeURI
、encodeURIComponent
)使用不正确时抛出。
2. 语法
new URIError([message[, fileName[, lineNumber]]])
3. 示例代码
示例1:错误的 URI 编码
try {
decodeURIComponent('%');
} catch (e) {
console.error(e.name + ': ' + e.message);
}
// 输出: URIError: URI malformed
示例2:非法的字符编码
try {
decodeURI('%E0%A4%A');
} catch (e) {
console.error(e.name + ': ' + e.message);
}
// 输出: URIError: URI malformed
function safeDecodeURIComponent(uri) {
try {
return decodeURIComponent(uri);
} catch (e) {
console.error('无法解码 URI: ' + uri);
return null;
}
}
五、总结
- ReferenceError:当引用未声明的变量或作用域中不存在的变量时抛出。
- SyntaxError:当代码的语法不正确,无法被解析时抛出。
- TypeError:当变量或参数不是预期类型,或操作不支持时抛出。
- URIError:当 URI 处理函数使用不当,导致编码或解码失败时抛出。
参考资料:
- MDN Web Docs - ReferenceError
- MDN Web Docs - SyntaxError
- MDN Web Docs - TypeError
- MDN Web Docs - URIError