# 前提
###開発言語
・python3
###使用
・自動ツールで、処理のパラメータなどをスプレッドシートから読み取り、結果をスプレッドシートに記入しています。
・ツールは複数実行される
・ツール数は20以上で、同時には実行されないように時間をずらしていますが、どうしても複数重なるタイミングがあります。その時にエラーが発生
困っていること
pythonのコードの書き方で、例外処理をどうすれば綺麗に書けるかわかりません。
pythonのgspread
を使っていてアクセス制限が生じます。
それは、100秒間に100アクセスしかできない制約で、このエラー自体は起きるものだと想定しています。
そのエラーの場合100秒間待機してから再呼び出しをしたいと考えています。
現状
python
1 2class Spread_Sheet: 3 def __init__(self): 4 # シートのオブジェクトを作成 5 #2つのAPIを記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない 6 scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive'] 7 #認証情報設定 8 json_string = gas_json.json_string 9 credentials = ServiceAccountCredentials._from_parsed_json_keyfile(json_string, scope) 10 #OAuth2の資格情報を使用してGoogle APIにログインします。 11 gc = gspread.authorize(credentials) 12 13 self.workbook = gc.open_by_key(SPREADSHEET_KEYS) 14 15 16 # シートが存在するのかチェック 17 def exists_vsheet_check(self,s_name): 18 is_Exists = False 19 worksheets = self.workbook.worksheets() # シート一覧を取得 20 worksheets_list = [ss.title for ss in worksheets] 21 22 if s_name in worksheets_list: 23 is_Exists = True 24 return is_Exists 25 26 # パラメータの取得 27 def get_parameter(self,s_name): 28 pass 29 30 # データの更新 31 def set_date(self,s_name): 32 pass 33 34 # ・ 35 # ・ 36 # ・ 37
この様に、スプレッドシートを操作するクラスを用意して、全てのアクセスをそのクラスからするようにしています。
基本的にself.workbook
を使うと1回のカウントとなり、100秒間に100回を超えるとエラーがでます。
そのエラーがgspread.exceptions.APIError
です。これに例外処理したら次はrequests.exceptions.connectionerror
のエラーが出たので下記のように変更しました。
python
1 2class Spread_Sheet: 3 e_count = 0 4 while True: 5 try: 6 7 # シートのオブジェクトを作成 8 #2つのAPIを記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない 9 scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive'] 10 #認証情報設定 11 json_string = gas_json.json_string 12 credentials = ServiceAccountCredentials._from_parsed_json_keyfile(json_string, scope) 13 #OAuth2の資格情報を使用してGoogle APIにログインします。 14 gc = gspread.authorize(credentials) 15 #共有設定したスプレッドシートキーを変数[SPREADSHEET_KEY]に格納する。 16 SPREADSHEET_KEYS = ff.get_post_spread_key() 17 18 # ワークブック main 19 self.workbook = gc.open_by_key(SPREADSHEET_KEYS[0]) 20 # ワークブック 動画のあるシート 21 self.workbook_video = gc.open_by_key(SPREADSHEET_KEYS[(ff.get_tool()-1)//10]) 22 return 23 except: 24 random.randint(100,150) 25 e_count +=1 26 if e_count > 5: 27 raise 'Set_ALL_mail_message' 28 29 30 # シートが存在するのかチェック 31 def exists_vsheet_check(self,s_name): 32 e_count = 0 33 while True: 34 try: 35 36 is_Exists = False 37 worksheets = self.workbook_video.worksheets() # シート一覧を取得 38 worksheets_list = [ss.title for ss in worksheets] 39 40 if s_name in worksheets_list: 41 is_Exists = True 42 return is_Exists 43 44 except: 45 random.randint(100,150) 46 e_count +=1 47 if e_count > 5: 48 raise 'exists_vsheet_check' 49 50
全てのアクセスするとき、エラーが出たら5回は繰り返しています 笑
絶対間違っていると思ってここをなんとかしたいです。
考えたこと
要は、例外処理する場所を一か所にしたいです。
なので、高級関数を使って全部関数が経由する関数を作れば良いのでは無いかと思いましたが、引数がまちまちだったので向いていないと判断しました。
classにそういう機能が無いかな?と思ったのですが見つけることができませんでした。
何か良い方法はないでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/06 13:38