Pythonのboto3でS3オブジェクト取得時に、オブジェクトが存在しなかった場合 S3.Client.exceptions.NoSuchKey
というエラーが発生するとboto3のドキュメントには書かれています。しかしこのエラーをPythonで具体的にどうキャッチすればよいのかわからなかったので、動かしてみて調べました。
get_object
と head_object
でなぜか挙動が違ってました。
get_object
次の2パターンのコードでエラーをキャッチできました。
import boto3
s3_bucket = "..."
s3_key = "..."
session = boto3.session.Session()
s3_client = session.client("s3")
try:
s3_client.get_object(
Bucket = s3_bucket,
Key = s3_key,
)
except s3_client.exceptions.NoSuchKey as e:
"NOT FOUND ERROR!"
import boto3
import botocore.exceptions
s3_bucket = "..."
s3_key = "..."
session = boto3.session.Session()
s3_client = session.client("s3")
try:
s3_client.get_object(
Bucket = s3_bucket,
Key = s3_key,
)
except botocore.exceptions.ClientError as e:
if e.response["Error"]["Code"] == "NoSuchKey":
"NOT FOUND ERROR!"
else:
raise
※最後にraise
しているのは、NoSuchKey
以外のエラーがあるかもしれないので、念のためです。
head_object
次のコードでエラーをキャッチできました。
get_object
のマネをして s3_client.exceptions.NoSuchKey
を試してもできませんでした。
ClientError
でのキャッチもCode
の文字列がなぜか get_object
とは違います。
import boto3
import botocore.exceptions
s3_bucket = "..."
s3_key = "..."
session = boto3.session.Session()
s3_client = session.client("s3")
try:
s3_client.head_object(
Bucket = s3_bucket,
Key = s3_key,
)
except botocore.exceptions.ClientError as e:
if e.response["Error"]["Code"] == "404":
"NOT FOUND ERROR!"
else:
raise
バージョン情報
$ pip list | grep boto
boto3 1.14.63
botocore 1.17.63