プログラミング素人のはてなブログ

技術屋の末端。プログラミングも電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#、python3、ラズパイ始めました。

例外と戦う

f:id:s51517765:20180107184345j:plain
ラズパイでTwitterbotを運用していますが、稀に例外(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は削除することで対応。