You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js+TypeScript中child_process exec异常类型判定与转换方案

解决方案

最优方案:改用AWS SDK for JavaScript直接调用

调用AWS CLI属于间接调用,不仅存在额外性能开销,错误处理也更繁琐。直接使用AWS SDK for Node.js调用headObject接口,能直接获取SDK原生异常类型,支持instanceof检查:

import { S3Client, HeadObjectCommand, S3ServiceException } from "@aws-sdk/client-s3";

const s3Client = new S3Client({ region: "你的区域" });

try {
  await s3Client.send(new HeadObjectCommand({
    Bucket: "bucket_name",
    Key: "keyname"
  }));
  // 对象存在时的逻辑
} catch (error) {
  if (error.name === "NotFound") {
    // 处理对象不存在的情况
    console.log("对象不存在");
  } else if (error instanceof S3ServiceException) {
    // 处理其他S3服务异常
    console.error(error.message);
  } else {
    // 处理其他类型错误
    console.error("未知错误:", error);
  }
}

若必须使用AWS CLI的处理方式

如果因特殊需求必须用child_process.exec调用CLI,需注意exec抛出的错误并非字符串,而是包含stderr、code等属性的Error实例,可通过以下方式识别错误类型:

  • 检查退出码error.code:AWS CLI操作失败时会返回非0退出码,比如你示例中对象不存在对应的退出码是254
  • 解析error.stderr内容:CLI的错误信息会输出到stderr,可通过字符串匹配或正则提取错误类型

示例代码:

const { exec } = require('child_process');
const util = require('util');
const execPromise = util.promisify(exec);

try {
  const { stdout } = await execPromise(cliCommand);
} catch (error) {
  // 匹配对象不存在的404错误
  if (error.code === 254 && error.stderr.includes('(404)')) {
    console.log("对象不存在");
  } else if (error.stderr.includes('An error occurred')) {
    // 匹配其他S3服务相关错误
    console.error("S3操作失败:", error.stderr);
  } else {
    console.error("命令执行失败:", error.message);
  }
}

注意:CLI的退出码和错误文本格式可能随版本变化,这种方式稳定性不如SDK直接调用。


内容的提问来源于stack exchange,提问作者mmozedev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:03:24