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

如何捕获boto3下载S3文件失败的错误并获取相关报错信息

boto3 S3下载文件错误处理实现方案

boto3本身提供了完善的错误处理能力,所有和AWS服务交互产生的服务端、客户端异常都可以通过捕获botocore.exceptions下的异常类实现,同时可以搭配通用异常捕获覆盖本地IO等场景的问题。

完整可运行代码示例

import boto3
from botocore.exceptions import ClientError
import os
import hashlib

s3 = boto3.client('s3')
bucket_name = 'testunzipping'
object_key = 'DataPump_10000838.zip'
local_path = '/tmp/DataPump_10000838.zip'

try:
    # 执行下载
    s3.download_file(bucket_name, object_key, local_path)
    
    # 可选:下载完成后完整性校验(非分块上传对象适用)
    # 获取对象元数据的ETag
    response = s3.head_object(Bucket=bucket_name, Key=object_key)
    s3_etag = response['ETag'].strip('"')
    # 计算本地文件MD5
    md5_hash = hashlib.md5()
    with open(local_path, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            md5_hash.update(chunk)
    local_md5 = md5_hash.hexdigest()
    
    if s3_etag != local_md5:
        raise Exception(f"文件完整性校验失败,S3 ETag: {s3_etag}, 本地MD5: {local_md5}")
    
    print("文件下载且校验成功")

except ClientError as e:
    # 捕获AWS服务返回的错误
    error_code = e.response['Error']['Code']
    error_msg = e.response['Error']['Message']
    print(f"下载失败,AWS服务错误,错误码:{error_code},错误信息:{error_msg}")
    # 可根据错误码做差异化处理,比如404是对象不存在,403是权限不足
    # 此处可添加自定义告警逻辑
except OSError as e:
    # 捕获本地文件系统相关错误
    print(f"下载失败,本地IO错误,错误信息:{str(e)}")
except Exception as e:
    # 捕获其他未知错误
    print(f"下载失败,未知错误,错误信息:{str(e)}")

核心逻辑说明

  • 服务端/客户端交互异常捕获:ClientError是所有AWS API交互返回错误的统一父类,可以通过返回体中的Error.Code字段精准判断错误类型,比如403对应权限不足、404对应资源不存在、500类对应S3服务端故障。
  • 本地场景异常捕获:OSError覆盖所有本地文件操作相关的故障,比如临时目录权限不足、磁盘空间满、路径不存在等问题。
  • 完整性校验(可选):如果你的S3对象不是分块上传生成的,S3返回的ETag就是对象的MD5值,下载后校验可以避免网络传输过程中数据损坏、文件写入不全的问题。如果是分块上传的对象,可以在上传时自行记录MD5存入对象元数据,下载后取出校验即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:24:01