簡體   English   中英

引發異常或錯誤時,Ruby將每個塊接下來的一個

[英]Ruby each block next when exception or error is raised

我的耙子任務中有以下方法。

def call
  orders = Spree::Order.complete.where('completed_at >= :last_day', last_day: Time.now - 30.days)
  orders.each do |order|
    order_tracking = order.shipments.first.tracking
    next if order_tracking.nil?
    shipment = order.shipments.first
    results = fedex.track(tracking_number: order_tracking)
    tracking_info = results.first
    status = tracking_info.status.to_s
    delivery_date = tracking_info.delivery_at
    shipment.is_delivered = delivered?(status)
    shipment.date_delivered = delivery_date
    shipment.save
    puts "-> Shipping status was updated for #{order.number}"
  end
end

如果有沒有追蹤編號的訂單,我會在第5行的next跳過它。

我的問題:我怎么會做next ,如果一個跟蹤號碼是無效的,下面引發錯誤:

Fedex::RateError: Invalid tracking number.

理想情況下,我想將第5行更改為:

next if order_tracking.nil? || order_tracking.raised(Fedex::RateError) # something like that

先感謝您。

還會在此處引發RateError:

def process_request
  api_response = self.class.post(api_url, :body => build_xml)
  puts api_response if @debug == true
  response = parse_response(api_response)

  if success?(response)
    options = response[:track_reply][:track_details]

    if response[:track_reply][:duplicate_waybill].downcase == 'true'
      shipments = []
      [options].flatten.map do |details|
      options = {:tracking_number => @package_id, :uuid => details[:tracking_number_unique_identifier]}
      shipments << Request::TrackingInformation.new(@credentials, options).process_request
      end
      shipments.flatten
    else
      [options].flatten.map do |details|
        Fedex::TrackingInformation.new(details)
      end
    end
  else
    error_message = if response[:track_reply]
                      response[:track_reply][:notifications][:message]
                    else
                      "#{api_response["Fault"]["detail"]["fault"]["reason"]}\n--#{api_response["Fault"]["detail"]["fault"]["details"]["ValidationFailureDetail"]["message"].join("\n--")}"
                    end rescue $1
    raise RateError, error_message
  end
end

添加:

private

def fedex_track(tracking)
  fedex.track(tracking_number: tracking)
end

並將第7行的results更改為:

results = fedex_track(order_tracking) rescue next

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM