快速除錯 Ruby on Rails 初學者建議
除錯通過引發異常是容易得多不是通過 print
日誌語句眯眼,對於大多數的錯誤,它通常快得多比開啟了一個 IRB 除錯像 pry
或 byebug
。這些工具不應該是你的第一步。
快速除錯 Ruby / Rails:
1.快速方法:然後提高 Exception
然後 .inspect
結果
除錯 Ruby(尤其是 Rails)程式碼的最快方法是在方法或物件(例如 foo
)上呼叫 .inspect
時沿著程式碼的執行路徑傳送異常:
raise foo.inspect
在上面的程式碼, raise
觸發 Exception
即停止執行你的程式碼,並在你試圖除錯線路返回方便地包含了物件/方法 .inspect
資訊的錯誤資訊(即 foo
)。
這種技術對於快速檢查一個物件或方法( 例如,它是什麼? )以及立即確認一行程式碼是否在給定的上下文中完全執行是有用的。
2.後備:使用像 byebug
或 pry
這樣的 ruby IRB 偵錯程式
只有在獲得有關程式碼執行流程狀態的資訊後,才應考慮轉移到像 pry
或 byebug
這樣的 ruby gem irb 偵錯程式,你可以在其中深入研究執行路徑中物件的狀態。
要使用 byebug
gem 在 Rails 中進行除錯:
- 在 Gemfile 的開發組中新增
gem 'byebug'
- 跑
bundle install
- 然後使用,在要檢查的程式碼的執行路徑中插入短語
byebug
。
執行時,此 byebug
變數將開啟程式碼的 ruby IRB 會話,使你可以直接訪問物件的狀態,就像它們在程式碼執行中的那一點一樣。
像 Byebug 這樣的 IRB 偵錯程式對於在執行程式碼時深入分析程式碼的狀態非常有用。但是,與引發錯誤相比,它們更耗時,因此在大多數情況下它們不應該是你的第一步。
一般初學者建議
當你嘗試除錯問題時,總是建議: 閱讀!@#$ ing 錯誤訊息(RTFM)
這意味著在行動之前仔細和完整**地閱讀錯誤訊息,以便你*瞭解它試圖告訴你的內容。*除錯時,請在閱讀錯誤訊息時按此順序詢問以下心理問題 :
- 錯誤引用了哪個類? (即我有正確的物件類或我的物件
nil
? ) - 錯誤引用了什麼方法? (即它們是方法中的一個型別;我可以在這個型別/類物件上呼叫此方法嗎? )
- 最後,使用我在前兩個問題中可以推斷的內容,我應該調查哪些程式碼行? (記住:堆疊跟蹤中的最後一行程式碼不一定是問題所在。)
在堆疊跟蹤中,要特別注意來自專案的程式碼行(例如,如果使用 Rails,則以 app/...
開頭的行)。99%的時間問題出在你自己的程式碼上。
為了說明為什麼這個順序的解釋很重要……
例如 Ruby 錯誤訊息讓很多初學者感到困惑:
你執行在某些時候執行的程式碼:
@foo = Foo.new
...
@foo.bar
並且你收到一條錯誤訊息:
undefined method "bar" for Nil:nilClass
初學者看到這個錯誤,並認為問題是 bar
的方法是未定義的。**不是。**在這個錯誤中,重要的真實部分是:
for Nil:nilClass
for Nil:nilClass
意味著 @foo
是零! @foo
不是 Foo
例項變數! 你有一個 Nil
的物件。當你看到這個錯誤時,只是 ruby 試圖告訴你方法 bar
對於類 Nil
的物件不存在。 (好吧!因為我們正在嘗試使用一種方法來處理類 Foo
的物件而不是 Nil
)。
不幸的是,由於這個錯誤是如何編寫的(undefined method "bar" for Nil:nilClass
),很容易被人誤以為這個錯誤與 bar
是 undefined
有關。如果沒有仔細閱讀,這個錯誤會導致初學者錯誤地深入研究 Foo
上的 bar
方法的細節,完全錯過了提示該物件屬於錯誤類的錯誤部分(在這種情況下:nil)。通過完整閱讀錯誤訊息可以輕鬆避免這種錯誤。
摘要:
在開始任何除錯之前,請務必仔細閱讀整個錯誤訊息。這意味著:始終檢查類中的錯誤訊息型別的物件的第一,那麼它的方法,前開始偵探到任何堆疊跟蹤或程式碼行,你認為該錯誤可能發生。那 5 秒鐘可以為你節省 5 個小時的挫敗感。
tl; dr: 不要斜視列印日誌:改為異常。在除錯之前仔細閱讀錯誤,避免兔子漏洞。