快速调试 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: 不要斜视打印日志:改为异常。在调试之前仔细阅读错误,避免兔子漏洞。