快速除錯 Ruby on Rails 初學者建議

除錯通過引發異常容易得多不是通過 print 日誌語句眯眼,對於大多數的錯誤,它通常快得多比開啟了一個 IRB 除錯像 prybyebug。這些工具不應該是你的第一步。

快速除錯 Ruby / Rails:

1.快速方法:然後提高 Exception 然後 .inspect 結果

除錯 Ruby(尤其是 Rails)程式碼的最快方法是在方法或物件(例如 foo)上呼叫 .inspect 時沿著程式碼的執行路徑傳送異常:

raise foo.inspect

在上面的程式碼, raise 觸發 Exception停止執行你的程式碼,並在你試圖除錯線路返回方便地包含了物件/方法 .inspect 資訊的錯誤資訊(即 foo)。

這種技術對於快速檢查一個物件或方法( 例如,它是什麼? )以及立即確認一行程式碼是否在給定的上下文中完全執行是有用的。

2.後備:使用像 byebugpry 這樣的 ruby IRB 偵錯程式

只有在獲得有關程式碼執行流程狀態的資訊後,才應考慮轉移到像 prybyebug 這樣的 ruby gem irb 偵錯程式,你可以在其中深入研究執行路徑中物件的狀態。

要使用 byebug gem 在 Rails 中進行除錯:

  1. 在 Gemfile 的開發組中新增 gem 'byebug'
  2. bundle install
  3. 然後使用,在要檢查的程式碼的執行路徑中插入短語 byebug

執行時,此 byebug 變數將開啟程式碼的 ruby IRB 會話,使你可以直接訪問物件的狀態,就像它們在程式碼執行中的那一點一樣。

像 Byebug 這樣的 IRB 偵錯程式對於在執行程式碼時深入分析程式碼的狀態非常有用。但是,與引發錯誤相比,它們更耗時,因此在大多數情況下它們不應該是你的第一步。

一般初學者建議

當你嘗試除錯問題時,總是建議: 閱讀!@#$ ing 錯誤訊息(RTFM)

這意味著在行動之前仔細完整**地閱讀錯誤訊息,以便你*瞭解它試圖告訴你的內容。*除錯時,請在閱讀錯誤訊息時按此順序詢問以下心理問題 :

  1. 錯誤引用了哪個? (即我有正確的物件類或我的物件 nil
  2. 錯誤引用了什麼方法? (即它們是方法中的一個型別;我可以在這個型別/類物件上呼叫此方法嗎?
  3. 最後,使用我在前兩個問題中可以推斷的內容,我應該調查哪些程式碼行? (記住:堆疊跟蹤中的最後一行程式碼不一定是問題所在。)

在堆疊跟蹤中,要特別注意來自專案的程式碼行(例如,如果使用 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),很容易被人誤以為這個錯誤與 barundefined 有關。如果沒有仔細閱讀,這個錯誤會導致初學者錯誤地深入研究 Foo 上的 bar 方法的細節,完全錯過了提示該物件屬於錯誤類的錯誤部分(在這種情況下:nil)。通過完整閱讀錯誤訊息可以輕鬆避免這種錯誤。

摘要:

在開始任何除錯之前,請務必仔細閱讀整個錯誤訊息。這意味著:始終檢查中的錯誤訊息型別的物件的第一,那麼它的方法開始偵探到任何堆疊跟蹤或程式碼行,你認為該錯誤可能發生。那 5 秒鐘可以為你節省 5 個小時的挫敗感。

tl; dr: 不要斜視列印日誌:改為異常。在除錯之前仔細閱讀錯誤,避免兔子漏洞。