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とかで検索かけてみても、たくさん引っかかりすぎる。。。
う〜ん、だめだ。
一旦、これは寝かしておこう。。。