首页 > 解决方案 > 将文件上传到 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

标签: python-3.xexceptionamazon-s3boto3

解决方案


推荐阅读