HTTPResponse#value は 2xx系の response でない場合、例外を返す

def expand(url)
  target_url = url
  loop do
    res = fetch(target_url)
    case res
    when Net::HTTPSuccess then
      return target_url
    when Net::HTTPRedirection then
      target_url = res["location"]
    else
      return res.value
    end
  end
end

省略されている URL (t.co など)を展開するために、上記の様な関数を書いたんだけども、response が 404 Not Found が出た時に処理がこけているという指摘をいただいた。

HTTPResponse#response の処理を確認

pry(main)> show-method Net::HTTPResponse#value

def value
  error! unless self.kind_of?(Net::HTTPSuccess)
end

2xx 系の response ではない場合に error! メソッドをコールしている。

HTTPResponse#error! メソッドを確認

pry(main)> show-method Net::HTTPResponse#error!

def error!   #:nodoc:
  raise error_type().new(@code + ' ' + @message.dump, self)
end

例外を raise してました。

参考

http://docs.ruby-lang.org/ja/2.0.0/method/Net=3a=3aHTTPResponse/i/value.html

マニュアルにも書いてある