try...catch
是 JavaScript 中处理运行时错误的主要机制,它允许你"尝试"执行代码并在出现错误时"捕获"这些错误,而不是让整个脚本失败。
try {
// 尝试执行的代码
} catch (error) {
// 当 try 块中的代码抛出错误时执行
// error 参数包含了错误信息
} finally {
// 无论是否发生错误都会执行的代码(可选)
}
try
块中的代码catch
块会被跳过try
块执行停止,控制流转移到 catch
块finally
块无论是否有错误都会执行catch
块接收的错误对象通常包含以下属性:
name
:错误名称(如 "ReferenceError", "TypeError" 等)message
:关于错误的详细描述stack
:错误的堆栈跟踪(非标准,但大多数环境支持)try {
// 代码
} catch (error) {
console.log(error.name); // 错误类型
console.log(error.message); // 错误信息
}
try {
console.log(undefinedVariable);
} catch (error) {
console.log("发生错误:", error.message);
// 输出: "发生错误: undefinedVariable is not defined"
}
let json = "{ bad json }";
try {
let data = JSON.parse(json);
} catch (error) {
console.log("JSON 解析错误:", error.message);
// 输出: "JSON 解析错误: Unexpected token b in JSON at position 2"
}
function divide(a, b) {
try {
if (b === 0) throw new Error("除数不能为零");
return a / b;
} catch (error) {
console.log(error.message);
return null;
} finally {
console.log("计算完成");
}
}
divide(10, 2); // 输出 "计算完成",返回 5
divide(10, 0); // 输出 "除数不能为零" 和 "计算完成",返回 null
你可以使用 throw
语句抛出自定义错误:
try {
let age = 15;
if (age < 18) {
throw new Error("年龄不足");
}
} catch (error) {
console.log(error.message); // "年龄不足"
}
JavaScript 有几种内置错误类型:
Error
- 通用错误SyntaxError
- 语法错误ReferenceError
- 引用未定义变量TypeError
- 值不是预期类型RangeError
- 数值超出有效范围URIError
- encodeURI()/decodeURI() 使用不当你可以检查错误类型:
try {
// 代码
} catch (error) {
if (error instanceof TypeError) {
console.log("类型错误");
} else if (error instanceof ReferenceError) {
console.log("引用错误");
} else {
console.log("其他错误");
}
}
try...catch
来处理预期内的错误(通常可以用条件判断代替)try
块尽可能小,只包含可能出错的代码catch
块中提供有意义的错误处理或日志记录finally
清理资源(如关闭文件、网络连接等)try...catch
是处理同步代码中运行时错误的强大工具,但对于异步代码(如 Promise),通常需要使用 .catch()
方法或 async/await
配合 try...catch
。