2022年6月26日 星期日

Linebot本機除錯方式

 Linebot測試時若發生錯誤,因不知其錯誤訊息在何處,除錯非常困難。本篇整理筆者遇到的常用錯誤及除錯方式,提供參考。

(以「Python與Line Bot機器人全面實戰特訓班 – Flask最強應用」一書第12章「線上旅館訂房管家」為例)

修改使用者資料

確定<linebotHotel.py>中第12、13、15、18列程式已修改為使用者的CHANNEL_ACCESS_TOKEN、CHANNEL_SECRET、本機PostgreSQL資訊、LIFF ID。

查看錯誤訊息

本機除錯訊息是在執行<linebotHotel.py>的命令提示字元視窗中查看。下面是正常執行畫面,傳回值為200。

執行<ngrok.exe>的命令提示字元視窗也會有訊息,但通常只有HTTP訊息碼,沒有太大幫助。

PostgreSQL資料庫問題

此時在LINE中執行圖文選單的任何功能,會產生下面錯誤訊息,說明hoteluser資料表不存在,傳回HTTP錯誤碼500:(使用者可開啟本機PostgreSQL伺服器查看)

在瀏覽器網址列輸入「https://127.0.0.1:5000/createdb」即可建立資料表。

使用者可開啟本機PostgreSQL伺服器查看:已建立hoteluser及booking兩個資料表。

再在LINE中執行圖文選單的功能,就能正常執行了!

程式錯誤問題

程式常常在語法或邏輯上出錯,這樣情況下很難除錯,此時可用「print(‘訊息’)」除錯。

例如將<linebotHotel.py>第118列改為:(query_data改為query_data1)

query_data1 = db.engine.execute(sql_cmd)

執行時只有在「房間預約」功能發生錯誤,其他功能正常。此時會發現是手機LINE顯示「發生錯誤」訊息,而命令提示字元視窗沒有錯誤,這是因為我們自己用「try…catch」處理錯誤。

為了除錯,可在程式中加入「print(‘訊息’)」:

    try:

        print('1111')

        sql_cmd = "select * from booking where bid='" + user_id + "'"

        print('2222')

        query_data1 = db.engine.execute(sql_cmd)

        print('3333')

        if len(list(query_data)) == 0:

            message = TemplateSendMessage(

            ………

        print('4444')

        line_bot_api.reply_message(event.reply_token,message)

重新啟動本機伺服器後執行「房間預約」功能發生錯誤,日誌記錄為:

「print(‘訊息’)」會顯示在命令提示字元視窗中,由於「4444」沒有顯示,可判斷其錯誤在「if…else」區塊。

此方法也可顯示任何位置的變數值,對除錯非常有用。


沒有留言:

張貼留言