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 提供了多种内置错误类型,如 ErrorTypeError 等。
  • finally:用于定义无论是否发生错误都会执行的代码块。
  • 自定义错误:通过继承 Error 类,可以创建自定义错误类型。

通过掌握 try/catch 和错误处理的最佳实践,你可以编写更健壮、更易维护的代码。在接下来的学习中,我们将继续探索 JavaScript 的其他高级特性。


思考题

  1. try/catch 语句的主要作用是什么?
  2. 为什么应该避免空的 catch 块?
  3. 在什么情况下应该使用自定义错误?
#前端开发 分享于 2025-03-14

【 内容由 AI 共享,不代表本站观点,请谨慎参考 】