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」區塊。
此方法也可顯示任何位置的變數值,對除錯非常有用。
沒有留言:
張貼留言