我正在拍摄视频'来自youtube的数据,包括常规video info
和likes 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
答案 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