为什么我的堆栈中的kernel_require.rb会跟踪?

时间:2013-05-18 12:28:17

标签: ruby error-handling

我忘了把结尾这个词放在if语句的末尾, 并得到以下错误:

/home/***/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require': **/home/****/Desktop/ruby/food_finder/lib/restaurant.rb:84: syntax error, unexpected end-of-input, expecting keyword_end (SyntaxError)**
    from /home/****/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require'
    from /home/****/Desktop/ruby/food_finder/lib/guide.rb:1:in `<top (required)>'
    from /home/****/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require'
    from /home/****/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require'
    from init.rb:14:in `<main>'

我的代码没有错误:

def self.saved_restaurants
        # read the restaurant file
        restaurants = []
        if file_usable?
            file = File.new(@@filepath, 'r')

            file.each_line do |line|
                restaurants << Restaurant.new.import_line(line.chomp)
            end

            file.close
        **end** -- > forgotten end
        # return instances of restaurant
        return restaurants
    end

我的错误代码:

def self.saved_restaurants
        # read the restaurant file
        restaurants = []
        if file_usable?
            file = File.new(@@filepath, 'r')

            file.each_line do |line|
                restaurants << Restaurant.new.import_line(line.chomp)
            end

            file.close
         -- > forgotten end
        # return instances of restaurant
        return restaurants
    end

我的问题是: 为什么我会收到与我的代码有关的错误? 如下:

/home/***/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require': 
  1. 这个错误是什么意思?
  2. 当我使用saved_restaurants方法的正确语法时,我没有收到任何错误。

2 个答案:

答案 0 :(得分:3)

您的文件restaurant.rbrequire中的方法调用guide.rb读取,该调用在kernel_require.rb中定义。在其方法定义中,它具有以下部分:

def require path

  ...

rescue LoadError => load_error

  ...

  raise load_error
end

当您在读取的文件中出现语法错误时,会引发LoadError,这将被拯救,并将被引发为require的错误。

答案 1 :(得分:1)

如果我理解正确,有一个名为guide.rb的文件:

require restaurant

基本上,require是在kernel_require.rb中实现的函数,其原型如下:

require path

这里的路径是restaurant.rb,这个函数失败了,因为语法错误导致require函数无法加载rb文件。

请记住,您正在查看调用堆栈,因此不应显示缺少结尾的函数,因为该函数未被调用,但只加载了ruby文件。