Ruby on Rails:如何处理异常(救援?)

时间:2015-01-04 09:03:12

标签: ruby-on-rails ruby

我正在拍摄视频'来自youtube的数据,包括常规video infolikes number

问题是有时候没有相应的数据。也许视频是私有的,或者喜欢的数字是0。

在任何一种情况下,都会报告NoMethodError: undefined method 'likes' for nil:NilClass 我怎么处理这个?我只是想忽略它们并继续播放下一个youtube视频。

我想我可以使用类似rescue的内容,但我找不到很多教程。

这是我的代码:

client = YouTubeIt::Client.new(:dev_key => my_key)
Video.all.each do |video|
  video_info = client.video_by(video.url)
  like_number = video_info.rating.likes.to_i
  video.likes = like_number
  if video.save
    puts "#{video.title} likes: #{video.likes}"
  end
end

3 个答案:

答案 0 :(得分:1)

而是使用异常处理,这种情况较慢,在这种情况下,只需在调用方法之前检查是否存在值。

假设在行

上生成错误
like_number = video_info.rating.likes.to_i

只需使用

client = YouTubeIt::Client.new(:dev_key => my_key)
Video.all.each do |video|
  video_info = client.video_by(video.url)
  # here check for the presence.
  if video_info.rating
    like_number = video_info.rating.likes.to_i
    video.likes = like_number
    if video.save
      puts "#{video.title} likes: #{video.likes}"
    end
  end
end

答案 1 :(得分:0)

您应该检查所有可能的 nil 值,例如video.nil?和相应的条件。救援应始终是你的最后手段(它很慢而且很脏),但是,如果没有办法预测脚本会失败的地方,你总是可以挽救一些代码:

begin
  #your error-prone code
rescue
  #action you want to take in case your error-prone code raises error
end

以下是关于例外的好文章:http://www.tutorialspoint.com/ruby/ruby_exceptions.htm

答案 2 :(得分:0)

在此示例中,方法体充当默认开始块,因此需要开始块

def any_method
  client = YouTubeIt::Client.new(:dev_key => my_key)
  Video.all.each do |video|
    video_info = client.video_by(video.url)
    # try tries to find the method, if not found returns nil 
    like_number = video_info.try(:rating).try(:likes).to_i
    video.likes = like_number
    if video.save
      puts "#{video.title} likes: #{video.likes}"
    end
  end
# For any type of standard errors, use rescue block    
rescue => error_object
  p 'Sorry, some error occured'
  p error_object
end