1

我正在使用“股票报价”gem ( https://github.com/tyrauber/stock_quote ) 根据用户输入的代码检索股票价格。虽然我有一个最新的股票代码列表,但在某些情况下搜索不会产生任何结果。我的代码中有这个来获取报价:

@companyname = StockQuote::Stock.quote(@ticker).company
@exchange = StockQuote::Stock.quote(@ticker).exchange
@price = StockQuote::Stock.quote(@ticker).last

当@ticker = "AKO-A"

undefined method `attributes' for nil:NilClass
file: stock.rb location: block in parse line: 90

无论如何通过使我的代码更健壮(如果错误然后“空白”)来避免这种 nomethoderror 吗?抱歉,我对 ruby​​ 比较陌生,如果能帮助我指出正确的方向,我将不胜感激。

4

3 回答 3

2

是的,问题肯定出在宝石上。它假设符号是准确的,并且没有正确解析错误符号的响应。

邋遢。重写类以获得更简洁的代码和更高的稳定性。添加在 response_code 实例方法中,该方法返回 200 或 404,具体取决于响应的有效性。还有,成功了吗?还是失败?实例方法。并且,更好的规格覆盖率。

版本颠簸,并推到 ruby​​gems。

于 2013-07-22T00:18:04.730 回答
0

nil这是 Ruby 代码中非常常见的情况,也是搜索失败时返回的常见习惯用法。

然而,当它无法获得良好的搜索结果时,这个特定的 gem 会有点不稳定。您可以通过使用begin ... rescue块来保护自己免受失败。

begin
  stock_quote = StockQuote::Stock.quote(@ticker)
rescue StandardError
  stock_quote = nil
end

if stock_quote
  @companyname = stock_quote.company
  @exchange = stock_quote.exchange
  @price = stock_quote.last
end

这对您来说可能不是理想的程序流程,因此您可能需要调整它。

注意StandardError默认情况下会被救出,我不需要写。您也可以输入NoMethodError您的情况,通常您希望将救援异常限制在您知道如何从错误中恢复的特定代码部分,并且仅限于您确信您的处理代码正在执行的错误类型正确的事。

于 2013-07-21T06:56:45.693 回答
0

这是一个关于如何使用救援来解决不存在股票代码问题的示例

require 'stock_quote'

class StockClass

def self.symbol_check(symbol)
  StockQuote::Stock.quote(symbol).symbol
end

def self.price_by_symbol(symbol)
  StockQuote::Stock.quote(symbol).latest_price
end

def self.write_price_by_symbol(symbol, price)
  filename = "#{symbol}.csv"
  todays_date = Time.now.strftime('%Y-%m-%d')
  File.open(filename, "a") do |file|
    file << "#{todays_date}, #{price}\n"
  end
end

end

def stock_price_selector(*symbol_array)
  symbol_array.each do |stock_name|
    begin
      stock_check = StockClass.symbol_check(stock_name)
    rescue  NoMethodError
      puts "#{stock_name} is a bogus ticker symbol"
    else
      stock_price = StockClass.price_by_symbol(stock_name)
      stock_written = StockClass.write_price_by_symbol(stock_name, stock_price)
    end
  end
end


stock_price_selector('AAPL', 'APPL', 'MSFT', 'GOOG')

这将跳过虚假符号“APPL”并适用于合法的股票代码。

于 2018-08-19T18:30:23.053 回答