如何捕获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
相关产品推荐
相关产品推荐

