4.5 try/catch 与错误处理
4.5 try/catch 与错误处理
在 JavaScript 中,错误处理是确保程序健壮性的重要手段。try/catch 语句用于捕获和处理运行时错误,避免程序崩溃。本节将详细介绍 try/catch 的用法、错误类型以及如何自定义错误。
4.5.1 try/catch 的基本语法
try/catch 语句用于捕获可能抛出错误的代码块,并在错误发生时执行相应的处理逻辑。
1. 语法
try {
// 可能抛出错误的代码
} catch (error) {
// 错误处理逻辑
}
2. 示例
try {
let result = 10 / 0;
if (!isFinite(result)) {
throw new Error("Division by zero");
}
console.log(result);
} catch (error) {
console.log(`Caught an error: ${error.message}`);
}
// 输出 "Caught an error: Division by zero"
4.5.2 错误类型
JavaScript 中有多种内置错误类型,常见的有:
Error:通用错误类型。SyntaxError:语法错误。ReferenceError:引用未定义的变量。TypeError:类型错误(如调用非函数)。RangeError:数值超出有效范围。
1. 示例
try {
let obj = null;
console.log(obj.name); // 抛出 TypeError
} catch (error) {
console.log(`Caught an error: ${error.name} - ${error.message}`);
}
// 输出 "Caught an error: TypeError - Cannot read property 'name' of null"
4.5.3 finally 语句
finally 语句用于定义无论是否发生错误都会执行的代码块,通常用于清理资源。
1. 语法
try {
// 可能抛出错误的代码
} catch (error) {
// 错误处理逻辑
} finally {
// 无论是否发生错误都会执行的代码
}
2. 示例
try {
console.log("Try block");
throw new Error("Something went wrong");
} catch (error) {
console.log(`Caught an error: ${error.message}`);
} finally {
console.log("Finally block");
}
// 输出:
// Try block
// Caught an error: Something went wrong
// Finally block
4.5.4 自定义错误
通过继承 Error 类,可以创建自定义错误类型,提供更详细的错误信息。
1. 定义自定义错误
class CustomError extends Error {
constructor(message, code) {
super(message);
this.code = code;
this.name = "CustomError";
}
}
2. 使用自定义错误
try {
throw new CustomError("Custom error occurred", 500);
} catch (error) {
console.log(`Caught an error: ${error.name} - ${error.message} (Code: ${error.code})`);
}
// 输出 "Caught an error: CustomError - Custom error occurred (Code: 500)"
4.5.5 错误处理的最佳实践
1. 捕获特定错误
尽量捕获特定类型的错误,而不是通用的 Error:
try {
// 可能抛出错误的代码
} catch (error) {
if (error instanceof TypeError) {
console.log("TypeError occurred");
} else if (error instanceof RangeError) {
console.log("RangeError occurred");
} else {
console.log("Unknown error occurred");
}
}
2. 避免空的 catch 块
空的 catch 块会隐藏错误,导致调试困难:
try {
// 可能抛出错误的代码
} catch (error) {
// 不要留空
console.log(error.message);
}
3. 使用 finally 清理资源
finally 块适合用于释放资源或执行清理操作:
let resource = allocateResource();
try {
useResource(resource);
} catch (error) {
console.log(error.message);
} finally {
releaseResource(resource);
}
4.5.6 示例代码
示例 1:捕获语法错误
try {
eval("alert('Hello)"); // 缺少闭合引号
} catch (error) {
console.log(`Caught an error: ${error.name} - ${error.message}`);
}
// 输出 "Caught an error: SyntaxError - Invalid or unexpected token"
示例 2:使用 finally
let file = openFile();
try {
readFile(file);
} catch (error) {
console.log(`Caught an error: ${error.message}`);
} finally {
closeFile(file);
}
示例 3:自定义错误
class ValidationError extends Error {
constructor(message, field) {
super(message);
this.field = field;
this.name = "ValidationError";
}
}
try {
throw new ValidationError("Invalid input", "username");
} catch (error) {
console.log(`Caught an error: ${error.name} - ${error.message} (Field: ${error.field})`);
}
// 输出 "Caught an error: ValidationError - Invalid input (Field: username)"
4.5.7 总结
try/catch:用于捕获和处理运行时错误。- 错误类型:JavaScript 提供了多种内置错误类型,如
Error、TypeError等。 finally:用于定义无论是否发生错误都会执行的代码块。- 自定义错误:通过继承
Error类,可以创建自定义错误类型。
通过掌握 try/catch 和错误处理的最佳实践,你可以编写更健壮、更易维护的代码。在接下来的学习中,我们将继续探索 JavaScript 的其他高级特性。
思考题:
try/catch语句的主要作用是什么?- 为什么应该避免空的
catch块? - 在什么情况下应该使用自定义错误?
#前端开发
分享于 2025-03-14
上一篇:4.4 IIFE 与现代模块模式
下一篇:5.1 对象字面量增强