やったもん勝ち

主にプログラミングのこと。生産性向上の某とかも。

pythonのboto3でのエラーハンドリング

問題

pythonのboto3で以下のようなコードを書いていて、

try:
    hoge()
except:
    print("error")

flake8にdo not use bare except'と怒られた。
pythonのエラーの書き方をちゃんと調べてみると、エラーの種類をexceptで指定しておかないと、エラーメッセージを表示する際に、実際のエラーの原因とは違うエラーメッセージを表示してしまい、バグのもとになるとのことで、かっちり書くことにしてみた。

ここで言うエラーの種類は、ZeroDivisionErrorとかNameErrorとかValueErrorとかだそうだ。

このhoge()で発生しているエラーがなんの種類のエラーなのか調べてみる。

try:
    hoge()
except:
    print(sys.exc_info())

をやってみると、

(<class 'botocore.errorfactory.LoadBalancerNotFoundException'>, LoadBalancerNotFoundException("An error occurred (LoadBalancerNotFound) when calling the DescribeLoadBalancers operation: Loa
d balancers '[fa]' not found",), <traceback object at 0x7f1eda94c708>)

と返ってくる。 なるほどと思い、

try:
    hoge()
except LoadBalancerNotFoundException:
    print("catch!")

と書くと、うまくいかぬ。 except botocore.errorfactory.LoadBalancerNotFoundExceptionとしてみても、だめ。

During handling of the above exception, another exception occurred:
.
.
.
    except botocore.errorfactory.LoadBalancerNotFoundException:
NameError: name 'botocore' is not defined

となる。さらにエラーが呼び出されてしまう。 どうやってエラーの種類を調べればいいのかは、結局分からなかったが、boto3のエラーハンドリングは以下のように書けるようだ。
stack overflowより( amazon web services - Boto3, python and how to handle errors - Stack Overflow

import boto3
from botocore.exceptions import ClientError

try:
    iam = boto3.client('iam')
    user = iam.create_user(UserName='fred')
    print "Created user: %s" % user
except ClientError as e:
    if e.response['Error']['Code'] == 'EntityAlreadyExists':
        print "User already exists"
    else:
        print "Unexpected error: %s" % e

Clientなのかぁ…解決。

知らないふり

ただ、この答えを書いてくれてる人はどうやってこれを探したんだろうか。。。 と、リファレンスも貼ってくれている。

Upgrading to Clients — botocore 1.8.34 documentation

なるほど、こういうときはライブラリのリファレンスのエラーハンドリングの章を参照すればいいのだな!

いやまて、botocoreってなんだ?boto3がラッパーしているライブラリ??
→ boto3のcoreだそうだ。

しかし、boto3のリファレンスから知らないふりして探そうとしてみても、先程のページが見つけられない。
errorとかで検索かけてみても、たくさん引っかかりすぎる。。。
う〜ん、だめだ。
一旦、これは寝かしておこう。。。