全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-15 6 分钟 ✍️ juanwangdev

Node.js try/catch/finally

try/catch/finally 捕获同步执行中的异常。

基本语法

结构

JavaScript
try {
  // 可能出错的代码
} catch (err) {
  // 错误处理
} finally {
  // 无论成功失败都执行
}

try 块

包裹风险代码

JavaScript
try {
  const data = JSON.parse(jsonString);
  const result = process(data);
} catch (err) {
  console.error('处理失败:', err.message);
}

多个语句

JavaScript
try {
  const file = fs.readFileSync('config.json');
  const config = JSON.parse(file);
  initialize(config);
} catch (err) {
  // 任意语句出错都会捕获
  handleError(err);
}

catch 块

捕获错误对象

JavaScript
try {
  riskyOperation();
} catch (err) {
  console.log('名称:', err.name);      // Error, TypeError 等
  console.log('消息:', err.message);   // 错误描述
  console.log('堆栈:', err.stack);     // 调用栈
}

条件捕获

JavaScript
try {
  operation();
} catch (err) {
  if (err instanceof TypeError) {
    console.log('类型错误:', err.message);
  } else if (err instanceof RangeError) {
    console.log('范围错误:', err.message);
  } else {
    console.log('其他错误:', err);
  }
}

重新抛出

JavaScript
try {
  operation();
} catch (err) {
  if (err.code === 'RECOVERABLE') {
    recover();
  } else {
    throw err;  // 无法处理,重新抛出
  }
}

finally 块

清理资源

JavaScript
let resource = null;
try {
  resource = acquireResource();
  process(resource);
} catch (err) {
  console.error('处理失败:', err);
} finally {
  // 确保释放资源
  if (resource) {
    releaseResource(resource);
  }
}

无论结果执行

JavaScript
let status = 'pending';
try {
  doWork();
  status = 'success';
} catch (err) {
  status = 'failed';
} finally {
  // 无论成功失败都记录
  logStatus(status);
}

无 catch 的 finally

JavaScript
try {
  operation();
} finally {
  cleanup();  // 清理后错误继续向上传播
}

完整示例

数据库操作

JavaScript
let connection = null;
try {
  connection = await db.connect();
  await connection.query('INSERT ...');
  await connection.commit();
} catch (err) {
  if (connection) {
    await connection.rollback();
  }
  throw err;
} finally {
  if (connection) {
    await connection.close();
  }
}

文件处理

JavaScript
let file = null;
try {
  file = fs.openSync('data.txt', 'r');
  const content = fs.readFileSync(file);
  parse(content);
} catch (err) {
  console.error('文件处理错误:', err.message);
} finally {
  if (file) {
    fs.closeSync(file);
  }
}

嵌套 try/catch

JavaScript
try {
  try {
    innerOperation();
  } catch (err) {
    if (err.recoverable) {
      recoverInner();
    } else {
      throw err;  // 传递到外层
    }
  }
  outerOperation();
} catch (err) {
  handleOuterError(err);
}

注意事项

不捕获异步错误

JavaScript
// try/catch 无法捕获异步回调中的错误
try {
  fs.readFile('file.txt', (err, data) => {
    if (err) throw new Error('读取失败');  // 不会被捕获
  });
} catch (err) {
  // 永远不会执行
}

// 正确做法
fs.readFile('file.txt', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
});

async/await 可捕获

JavaScript
// async/await 的 Promise 错误可被捕获
try {
  const data = await fs.promises.readFile('file.txt');
} catch (err) {
  console.error('读取失败:', err);
}

不要滥用

JavaScript
// 错误:用 try/catch 控制流程
try {
  const value = obj.property;
} catch (err) {
  // obj 可能不存在
}

// 正确:先检查
if (obj && obj.property) {
  const value = obj.property;
}

要点总结

  • try 包裹可能出错的代码
  • catch 捕获并处理错误
  • finally 无论结果都执行,用于清理
  • try/catch 只捕获同步错误
  • async/await 可用 try/catch 捕获 Promise 错误

📝 发现内容有误?点击此处直接编辑

← 上一篇 Node.js 微任务与宏任务
下一篇 → Node.js 全局未捕获异常处理
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库