JavaScript 错误处理:throw、try 和 catch
                           
天天向上
发布: 2025-02-26 23:15:54

原创
681 人浏览过

JavaScript 提供了多种方式来处理程序中的错误,throwtrycatch 是处理异常的核心工具。通过这些工具,你可以捕获和处理错误,以便让程序更健壮。

1. throw 语句

throw 语句用于抛出自定义的错误。抛出错误后,程序的执行会立即停止,并转到最近的 try 语句块(如果存在)。

语法:

throw expression;
  • expression 可以是任何类型的值,例如字符串、数字、对象等。

示例:使用 throw

function checkAge(age) {
  if (age < 18) {
    throw "Age must be 18 or older!";
  }
  return "Age is valid!";
}

try {
  console.log(checkAge(15));  // 这里会抛出错误
} catch (error) {
  console.log("Error: " + error);  // 输出 "Error: Age must be 18 or older!"
}

在上面的示例中,当 checkAge(15) 被调用时,由于年龄小于 18,throw 会抛出一个错误,捕获的错误会显示在 catch 中。

2. try…catch 语句

try...catch 语句用于捕获在 try 代码块中发生的错误。try 块中是你要执行的代码,如果代码抛出错误,则会跳转到 catch 块。

语法:

try {
  // 可能会抛出错误的代码
} catch (error) {
  // 处理错误
}
  • error 是一个异常对象,表示抛出的错误。

示例:使用 try…catch

try {
  let result = 10 / 0;  // 这里没有错误,但可以模拟其他错误
  console.log(result);
} catch (error) {
  console.log("An error occurred: " + error);
}

在这个例子中,除以零不会抛出 JavaScript 错误(它返回 Infinity),所以 catch 块不会执行。通常,try...catch 用于捕获实际可能抛出的错误(如网络请求失败、无效输入等)。

3. finally 语句

finally 语句用于指定一个无论是否发生异常都要执行的代码块。它通常用于清理操作,比如关闭文件、数据库连接等。

语法:

try {
  // 可能会抛出错误的代码
} catch (error) {
  // 处理错误
} finally {
  // 无论是否发生错误,都会执行的代码
}

示例:使用 finally

try {
  let result = 10 / 0;
  console.log(result);  // 输出 Infinity
} catch (error) {
  console.log("An error occurred: " + error);
} finally {
  console.log("Finally block executed!");  // 无论如何都会执行
}

输出:

Infinity
Finally block executed!

4. 捕获特定的错误类型

catch 语句块中,你可以通过 instanceof 运算符来检查抛出的错误类型,并根据不同类型的错误做出相应的处理。

示例:捕获特定类型的错误

try {
  let x = undefinedVariable;  // 抛出 ReferenceError 错误
} catch (error) {
  if (error instanceof ReferenceError) {
    console.log("ReferenceError: Variable is not defined!");
  } else if (error instanceof TypeError) {
    console.log("TypeError: Invalid type!");
  } else {
    console.log("An unknown error occurred");
  }
}

5. 自定义错误

除了使用默认的错误类型,JavaScript 允许你创建自定义的错误类型。你可以通过扩展 Error 对象来创建一个自定义错误类。

示例:创建自定义错误

class CustomError extends Error {
  constructor(message) {
    super(message);
    this.name = "CustomError";  // 自定义错误名称
  }
}

try {
  throw new CustomError("This is a custom error!");
} catch (error) {
  console.log(error.name + ": " + error.message);  // 输出 "CustomError: This is a custom error!"
}

6. 错误对象

catch 块中,错误对象通常包含以下属性:

  • name:错误的名称(例如,ReferenceErrorTypeError)。
  • message:错误的详细描述。
  • stack:堆栈跟踪,提供了错误发生的位置和调用栈的详细信息。

示例:错误对象

try {
  let x = y;  // 抛出 ReferenceError 错误
} catch (error) {
  console.log("Error name: " + error.name);  // ReferenceError
  console.log("Error message: " + error.message);  // y is not defined
  console.log("Stack trace: " + error.stack);  // 显示调用栈
}

7. 抛出自定义错误对象

你可以创建自己的错误对象,并通过 throw 抛出它们:

function validateAge(age) {
  if (age < 18) {
    throw new Error("Age must be 18 or older!");
  }
  return "Age is valid!";
}

try {
  console.log(validateAge(15));  // 抛出自定义错误
} catch (error) {
  console.log(error.message);  // 输出 "Age must be 18 or older!"
}

总结

  • throw:用于抛出自定义错误,停止当前代码的执行。
  • try…catch:用于捕获和处理代码中可能出现的错误,避免程序崩溃。
  • finally:无论是否抛出错误,都会执行的代码块,适合用于清理操作。
  • 错误对象:捕获的错误对象通常具有 namemessagestack 属性,帮助你诊断问题。
  • 自定义错误:可以创建自定义错误类型来使错误更具可读性和适应性。

使用这些工具,你可以更灵活、可靠地处理 JavaScript 中的错误,并确保代码在错误情况下依然能优雅地运行。

发表回复 0

Your email address will not be published. Required fields are marked *