pusaitou / mikochiku_alarm

GNU General Public License v3.0
17 stars 7 forks source link

requests.exceptions.ReadTimeout 発生時に停止することがある #51

Closed taizan-hokuto closed 4 years ago

taizan-hokuto commented 4 years ago

エラー内容

長時間起動テストしている際に、下記エラーが出て停止。 vscode上のターミナルから実行 起動から6時間40分

# ~~
buff_video_id_set set()
self.old_video_id_list []
buff_video_id_set set()
self.old_video_id_list []
Error:RequestException<class 'requests.exceptions.ReadTimeout'> HTTPSConnectionPool(host='m.youtube.com', port=443): Read timed out. (read timeout=10)
Traceback (most recent call last):
  File ".\mikochiku_alarm.py", line 101, in check_live
  File ".\mikochiku_alarm.py", line 136, in get_live_video_id
    source = vparser.get_source_json(self.request, search_ch_id)
  File "C:\project\saitoupu\mikochaku_alarm\vparser\__init__.py", line 112, in get_source_json

該当コード部分

https://github.com/pusaitou/mikochiku_alarm/blob/8b9e627a25571899ae0e4c51c29b839edcb83028/httpreq/__init__.py#L29-L50

今回はReadTimeout エラーなので、個別に捕捉されず、一番下のrequests.exceptions.RequestException (そのほかのエラー)として捕捉された。

(print(f'Error:RequestException{type(e)} {str(e)}') によるエラー表示が出ていることからもわかる)

問題はここで捕捉されたにもかかわらず、TypeError: a bytes-like object is required, not 'NoneType'を出して終了したこと。

期待する動作としては、 ①44行目でエラーを捕捉して ②46行目でエラー出力を行ったあと、 ③50行目でEMPTY_RESPONSEを返し、 ④vparser内のextract_video_ids()関数内で、JSONパース失敗のメッセージをコンソールに出して プログラムが継続すること。 であるが、②が終わった後、TypeError: a bytes-like object is required, not 'NoneType'を出して終了してしまった。 TypeError発生個所が112行目(空行)なのも不思議。

対応案

呼び出し元(mikochiku_alarm.pyのget_live_video_id)で例外処理を捕捉する。


    def get_live_video_id(self, search_ch_id):
        try:
            source = vparser.get_source_json(self.request, search_ch_id)
            video_ids  = vparser.extract_video_ids(source)
            return set(video_ids)
        except vparser.InvalidChannelIDException:
            # チャンネルページが見つからない場合
            # TODO: アラートダイアログをポップアウトさせたい
            print(f'{search_ch_id} は、存在しないチャンネルです。')
        except Exception as e:                             #add
            print(e)                                       #add
            print(f'不明なエラーが発生しました')            #add
‘‘‘
pusaitou commented 4 years ago

空行をエラー補足したのはホラーですね コンパイラーあるあるですが

taizan-hokuto commented 4 years ago

なるほど、コンパイラーではこういうことがあるんですね!

kobi32768 commented 4 years ago

Python、インデント依存すぎて怖い…

pusaitou commented 4 years ago

c言語だとコンパイラーが空行にエラーを出したら直前の文法が悪かったとかいうのはあったと思います いつも実行するときのpythonはコンパイルされてないので例としては微妙かもしれません