ラズパイでTwitterのbotを運用していますが、稀に例外(exception)が発生しています。
とりあえずは、↓のようにまるごとMainの中身にTry、exceptをつけて止まってしまうのを防止していました。
if __name__ == '__main__': while(True): tdatetime = dt.now() HH = int(tdatetime.strftime('%H')) # 時刻 MM = int(tdatetime.strftime('%M')) try: if ○○○○○○ #時刻をもとにタイマー実行するメインの処理 except : print("----------------------------------") print("Parent Error!",str(HH)+":"+str(MM)) print("----------------------------------")
しかし、これだと何が起こって例外が起きているのかわかりません。
そこで、例外の中身を表示するようにしました。
except Exception as e: print("----------------------------------") print("Parent Error!",str(HH)+":"+str(MM)) print(e) print("----------------------------------")
例外が発生したら、例外にException as e
という名前を付けてprint()します。
これで例外の原因がわかるはずです。
またラズパイでは、”nohup”を指定してプログラムを起動しておくと、
nohup.outというテキストファイルが作成され、このなかにprint()の内容が記録されていきます。
$ nohup python3 xxx.py bg
これであとからnohup.outを解析して、例外の原因を調べることができます。
これを仕込んで2週間。結果がわかりました。
発生していた例外は↓のようなものでした。
local variable 'word3' referenced before assignment
word3
はマルコフ連鎖を作成するときに、連続して4つとった4番目の単語ですが、これが代入される前に参照されたというものです。
一つ目に選択された文が4個未満の単語から生成されていると、word3
は未代入になってしまうための例外でした。
とりあえず、短すぎるTweetは削除することで対応。