HLJ 发布于
2025-06-11 10:42:50
1阅读

JavaScript错误处理:try...catch详解

JavaScript 错误处理:try...catch

try...catch 是 JavaScript 中处理运行时错误的主要机制,它允许你"尝试"执行代码并在出现错误时"捕获"这些错误,而不是让整个脚本失败。

基本语法

try {
  // 尝试执行的代码
} catch (error) {
  // 当 try 块中的代码抛出错误时执行
  // error 参数包含了错误信息
} finally {
  // 无论是否发生错误都会执行的代码(可选)
}

工作原理

  1. 首先执行 try 块中的代码
  2. 如果没有错误,catch 块会被跳过
  3. 如果发生错误,try 块执行停止,控制流转移到 catch
  4. finally 块无论是否有错误都会执行

错误对象

catch 块接收的错误对象通常包含以下属性:

  • name:错误名称(如 "ReferenceError", "TypeError" 等)
  • message:关于错误的详细描述
  • stack:错误的堆栈跟踪(非标准,但大多数环境支持)
try {
  // 代码
} catch (error) {
  console.log(error.name);     // 错误类型
  console.log(error.message);  // 错误信息
}

使用示例

1. 处理未定义变量

try {
  console.log(undefinedVariable);
} catch (error) {
  console.log("发生错误:", error.message); 
  // 输出: "发生错误: undefinedVariable is not defined"
}

2. JSON 解析错误处理

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"
}

3. 使用 finally

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("其他错误");
  }
}

最佳实践

  1. 不要过度使用 try...catch 来处理预期内的错误(通常可以用条件判断代替)
  2. 只捕获你能处理的错误
  3. 保持 try 块尽可能小,只包含可能出错的代码
  4. catch 块中提供有意义的错误处理或日志记录
  5. 使用 finally 清理资源(如关闭文件、网络连接等)

try...catch 是处理同步代码中运行时错误的强大工具,但对于异步代码(如 Promise),通常需要使用 .catch() 方法或 async/await 配合 try...catch

当前文章内容为原创转载请注明出处:http://www.good1230.com/detail/2025-06-11/826.html
最后生成于 2025-06-13 20:53:35
此内容有帮助 ?
0