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
相关产品推荐
相关产品推荐

