AWS SDK for Python (Boto3)で例外処理を行う方法
追記 ( 2019/08/07 )
見返したら分かりづらかったため、具体例の記事を書きました。
はじめに
私は普段からPython3.6でAWS Lambdaを書いているのですが、特定の例外はpassするように実装することが多々あります。
そこで、例外処理の方法でこうやった方がいいな~と思った方法があるので記事に残しておきます。
今までやっていた方法
今までは下記コードのようにやっていました。
エラー文はLambdaをテストした際に出てくるエラー文でexpectできます。
この方法では特定の例外はpassできますが、それ以外の例外がエラーになりません。(特定の例外以外の例外はエラーとしたいのが本音)
ちゃんとした方法
ちゃんとした方法はちゃんとしたエラーでexpectします。
ちゃんとしたエラーが分かってるなら最初からやれよwと思うかもしれませんが、普通にエラー文を眺めるだけだと分かりません。
※上記コードのエラー'client.expections.ClientError'は一例です。
例えば、下記のようなエラー文があったとして
'An error occurred (NoSuchBucketPolicy) when calling the GetBucketPolicy operation: The bucket policy does not exist'
エラーは'NoSuchBucketPolicy'とはならないのです。
エラーの調べ方
boto3のコードを見ると、インスタンス作成時にエラー周りも作成されています。
なのでこのあたりで調査。
大体以下の2つのコード内のクラスのどれかだと思います。
やっつけですいませんが、あとは頑張って探しましょう。
エラー文の具合で分かります。
例で出した
'An error occurred (NoSuchBucketPolicy) when calling the GetBucketPolicy operation: The bucket policy does not exist'は
'client.expections.ClientError'になるかと思います。(自分の場合、大抵のエラーはこれ)
おわりに
boto3のコード読んだことでエラーは'client.expections.ClientError'といった形になることが理解できました。※clientはboto3呼び出し時の変数です。
複雑なオブジェクト指向のせいで利用者側は分かりづらいんだよ!と思いつつ、boto3のコードを読んでみるととんでもなくしっかりと継承など設計されててぐぅの音も出ませんでした。
オープンソースにしてるんだからエラー内容とかは勝手に読めやといったところでしょうか。その心意気に参りました。
※補足
ちゃんとした方法だと違うエラーコードでも'client.expections.ClientError'になってしまう気がするので、今までやっていた方法のエラー文丸々での分岐も使い道はありそうです。