python-3.x - 将文件上传到 AWS 时无法捕获异常
问题描述
我是 AWS 的初学者。在 python 中使用 boto3 时,我试图在将文件上传/下载到 AWS 时处理异常。出于测试目的,我故意在代码中传递了错误的存储桶名称。这会导致botocore.errorfactory.NoSuchBucket错误。我只能在下载文件时捕获异常,但不能在上传时捕获异常!
我下载文件的代码是这样的(我在那个目录中有多个文件,因此使用 list_objects)。
try:
response = s3.list_objects(Bucket=bucket, Prefix=prefix)
for file in response['Contents']:
filename = file['Key'].rsplit('/', 1)[1]
if filename == required_filename:
s3.download_file(bucket, file['Key'], os.path.join(dir, filename))
except botocore.exceptions.ClientError as e:
error_message = ''.join(e.args)
print('ERROR DOWNLOADING FILE FROM AWS BUCKET ' + error_message)
我上传文件的代码是这样的(我将在该目录中有一个文件,因此不使用 list_objects)。
try:
s3.upload_file(os.path.join(destination, filename), bucket, s3_path + filename)
except botocore.exceptions.ClientError as e:
error_message = ''.join(e.args)
print('ERROR UPLOADING FILE TO AWS BUCKET ' + error_message)
上传文件时错误堆栈跟踪的一部分。
File "/.../lib/python3.6/site-packages/s3transfer/tasks.py", line 150, in _execute_main
return_value = self._main(**kwargs)
File "/.../lib/python3.6/site-packages/s3transfer/upload.py", line 692, in _main
client.put_object(Bucket=bucket, Key=key, Body=body, **extra_args)
File "/.../lib/python3.6/site-packages/botocore/client.py", line 357, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/.../lib/python3.6/site-packages/botocore/client.py", line 661, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.errorfactory.NoSuchBucket: An error occurred (NoSuchBucket) when calling the PutObject operation: The specified bucket does not exist
During handling of the above exception, another exception occurred:
File "/.../lib/python3.6/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
raise exc
File "/.../lib/python3.6/site-packages/rest_framework/views.py", line 502, in dispatch
response = handler(request, *args, **kwargs)
File "/.../lib/python3.6/site-packages/rest_framework/decorators.py", line 50, in handler
return func(*args, **kwargs)
File ".../views.py", line 81, in uploadFileToAWS
s3.upload_file(os.path.join(destination, filename), bucket, s3_path + filename)
File "/.../lib/python3.6/site-packages/boto3/s3/inject.py", line 131, in upload_file
extra_args=ExtraArgs, callback=Callback)
File "/.../lib/python3.6/site-packages/boto3/s3/transfer.py", line 287, in upload_file
filename, '/'.join([bucket, key]), e))
boto3.exceptions.S3UploadFailedError: Failed to upload *filename* to *filepath*: An error occurred (NoSuchBucket) when calling the PutObject operation: The specified bucket does not exist
解决方案
推荐阅读
- mysql - Docker Swarm Keyrock Mysql 子网连接
- php - 在 MySQL 数据库中搜索服务于输入 lat/long 的值
- android - 如何停止 IntentService Android
- powerbi - 如何过滤今天前 2 天的日期
- laravel - 将参数传递给组件时出错
- javascript - 如何更改 JSXGraph 轴图中网格线的粗细?
- node.js - 如何将事件添加到使用 google 成功登录到我的 MERN Stack 应用程序的用户?
- java - Java8 - 显式类型如何匹配一个变体 - 而不是其他类型?
- c# - 如何动态添加日期从星期一开始的星期名称作为表头?
- haskell - Haskell 映射直到满足第一个条件