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