Linebot上傳Heroku後測試若發生錯誤,因其錯誤訊息不明確,除錯非常困難。本篇整理筆者遇到的常用錯誤及除錯方式,提供參考。
(以「Python與Line Bot機器人全面實戰特訓班 – Flask最強應用」一書第13章為例)
修改使用者資料
確定<linebotHotel.py>中第10、11、13、16列程式已修改為使用者的CHANNEL_ACCESS_TOKEN、CHANNEL_SECRET、Heroku的PostgreSQL資訊、LIFF ID。
查看錯誤日誌
在Heroku應用程式於右上角More下拉式選單中點選View logs功能。
下面是正常日誌頁畫面。
PostgreSQL資料庫問題
如果忘記在Heroku應用程式建立PostgreSQL資料庫(參考書中P13-6),將會產生下面錯誤訊息:
請依書中P13-6建立PostgreSQL資料庫。
接著再執行時會產生下面錯誤訊息,表示未建立資料表:
在瀏覽器網址列輸入「https://應用程式名稱.herokuapp.com/createdb」即可建立資料表。
缺少模組問題
虛擬環境要安裝所有必需的模組,<requirements.txt>才會包含所有模組列表。下圖為缺少line-bot-sdk模組的日誌:
此處錯誤較模糊,意為應用程式崩解。在<requirements.txt>中加入「line-bot-sdk==1.8.0」即可。
程式錯誤問題
程式上傳Heroku之前,最好在本機測試到完全無誤再上傳。但有時還是會在上傳後發生問題,此時可用「print(‘訊息’)」除錯。
例如將<linebotHotel.py>第116列改為:(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」區塊。
此方法也可顯示任何位置的變數值,對除錯非常有用。
沒有留言:
張貼留言