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

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、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は削除することで対応。