2022年6月26日 星期日

Linebot上傳Heroku除錯方式

 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」區塊。

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



沒有留言:

張貼留言