JavaScript 作用域
JavaScript strict 

JavaScript 异常处理

在 JavaScript 中,异常处理是一种处理运行时错误(异常)的重要机制,它能帮助我们优雅地处理可能发生的错误,避免程序因错误而崩溃或产生意外行为。


1、try-catch-finally 语句

JavaScript 中主要通过 try、catch 和 finally 三个关键字来进行异常处理:

try: 包含可能会抛出异常的代码块。

catch: 捕获并处理 try 代码块中抛出的异常。

finally: 无论是否抛出异常,都会执行的代码块(可选)。

try {
  // 可能会抛出异常的代码
  let result = 10 / 0; // 这里会抛出一个除以零的异常
  console.log(result); // 这行代码不会被执行
} catch (error) {
  // 处理异常的代码
  console.error('An error occurred:', error.message);
} finally {
  // 不管是否抛出异常,都会执行的代码
  console.log('Execution completed.');
}


2. throw 语句

throw 语句用于手动抛出异常。可以抛出任何值,通常是一个 Error 对象或继承自 Error 的自定义异常对象。

function validateNumber(x) {
  if (typeof x !== 'number') {
    throw new Error('Invalid input: not a number');
  }
  return x;
}
try {
  let result = validateNumber('abc');
  console.log('Validation passed:', result);
} catch (error) {
  console.error('Validation failed:', error.message);
}


3. 自定义异常对象

除了使用 Error 对象外,还可以创建自定义的异常对象,通过继承 Error 类来扩展其功能。

class CustomError extends Error {
  constructor(message) {
    super(message);
    this.name = 'CustomError';
  }
}
function processData(data) {
  if (!data) {
    throw new CustomError('Data is required');
  }
  // 处理数据
}
try {
  processData(null);
} catch (error) {
  console.error(error.name + ': ' + error.message);
}


4. 全局异常处理

可以使用 window.onerror 或 window.addEventListener('error', handler) 来捕获全局的未捕获异常,通常用于记录错误或发送错误报告。

window.onerror = function(message, source, lineno, colno, error) {
  console.error('Error:', message, 'at', source, 'line', lineno, 'column', colno);
};
// 或者使用事件监听器
window.addEventListener('error', function(event) {
  console.error('Uncaught error:', event.error.message);
});


5. 异步异常处理

对于异步操作中的异常处理,可以使用 try-catch 包裹 async 函数的调用,或者在 Promise 的 catch 方法中处理异常。

async function fetchData() {
  try {
    let response = await fetch('https://nonexistent-api.example.com');
    let data = await response.json();
    console.log('Data fetched:', data);
  } catch (error) {
    console.error('Fetch operation failed:', error.message);
  }
}
fetchData();


总结

异常处理是编写健壮 JavaScript 代码的重要组成部分。通过 try-catch-finally 语句可以捕获和处理异常,throw 语句可以手动抛出异常。合理使用异常处理可以提高代码的可靠性和可维护性,特别是在处理用户输入、网络请求等可能导致错误的场景中。