我不是程序员,对Ruby语言知之甚少。我有一个从网站上获取产品信息的报废程序,我正在尝试添加救援代码来处理HTTP 404错误,所以它不会结束报废但继续下一个产品。
我需要将救援添加到下面的代码中:
def initialize(id, log = nil, timeout_threshold = nil)
@log_buffer = nil
# prepare internal logging stream
@log = (!log.nil? and log.is_a?(Logger)) ? log : Logger.new(@log_buffer=StringIO.new)
begin
# store instance url address
@id = id.to_s
@url = Link::base_url + 'en-US/item_' + @id + '.htm'
# set remote timeout threshold
@timeout_threshold = (timeout_threshold.to_i > 0) ? timeout_threshold.to_i : 15
@timeout = false
@expired = false
if url_verify
Timeout::timeout(@timeout_threshold) {
Mechanize.html_parser = Nokogiri::HTML
@@agent = Agent.instance
###TODO: [optional?] login
###TODO: [optional?] or login iff pricing not present?
###TODO: Agent.get(user login page)
###TODO: Agent.fill in user/pswd
###TODO: Agent.submit
@html = @@agent.get(url)
@log.info("Alamode Product #{@id.to_s}: Load #{url.to_s}")
@specification = parse_specifications
@quantity, @mapped_quantity = parse_quantities
@price = parse_price
@valid = true
# check parsed page
if @specification.size.zero? and @quantity.size.zero?
@valid = false
@expired = true
@log.warn("Alamode Product #{@id.to_s}: #{url.to_s} unscrappable (product no longer available?)")
else
@log.info("stAlamode Product #{@id.to_s}: #{url.to_s} successfully parsed")
@log.info(" QTY #{@mapped_quantity.to_s}")
end
}
else
# return error message
@valid = false
@log.error("Alamode Product #{@id.to_s}: #{url.to_s} is not a properly formatted URI address")
end
rescue Timeout::Error
@valid = false
@timeout = true
@log.error("Alamode Product #{@id.to_s}: #{url.to_s} did not respond within allocated time")
end
end
先谢谢。
答案 0 :(得分:0)
Ruby允许你堆叠救援条款。
begin
...
rescue YourErrorName
...
rescue Timeout::Error
...
end
在新子句中,您可以安静地退出(不做任何事情 - 更好地记录结果)或者使用下一个id开始报废。 我不熟悉Nokogiri,所以你必须自己找出错误名称;) 祝你好运!