如何让Amazon S3的C# .NET Core SDK调用GetObjectAsync不抛异常?
解决方案
可以通过配置AWS S3客户端参数,让GetObjectAsync不抛出异常,转而通过响应结果判断对象是否存在,具体实现如下:
方法一:关闭全局异常抛出
修改AmazonS3Config的ThrowOnError属性为false,SDK将不再主动抛出异常,所有请求结果(包括错误)都会通过响应对象返回:
var s3Config = new AmazonS3Config { ThrowOnError = false }; using var s3Client = new AmazonS3Client(s3Config); var getRequest = new GetObjectRequest { BucketName = "目标存储桶名称", Key = "目标对象键" }; var response = await s3Client.GetObjectAsync(getRequest); // 根据响应状态码判断对象状态 if (response.HttpStatusCode == HttpStatusCode.NotFound) { // 对象不存在,执行对应逻辑 } else if (response.HttpStatusCode == HttpStatusCode.OK) { // 对象存在,读取响应流处理内容 using var contentStream = response.ResponseStream; // 后续业务逻辑 } else { // 处理其他HTTP错误状态 }
补充说明
- 设置
ThrowOnError = false后,所有S3操作的异常都会被抑制,因此需要主动检查响应的状态码或response.ErrorCode来识别错误类型,避免遗漏其他异常场景。 - 如果希望减少API调用次数,也可以先调用
DoesObjectExistAsync检查对象是否存在,再决定是否执行GetObjectAsync,这种方式适合对象不存在为高频场景的情况:
var exists = await s3Client.DoesObjectExistAsync("目标存储桶名称", "目标对象键"); if (exists) { var response = await s3Client.GetObjectAsync("目标存储桶名称", "目标对象键"); // 处理对象内容 } else { // 对象不存在逻辑 }
内容的提问来源于stack exchange,提问作者Dmitry Arestov
相关产品推荐
相关产品推荐

