Спасение не захватывает неудачу - PullRequest
0 голосов
/ 25 августа 2018

Я что-то здесь упускаю, но по какой-то причине мой begin затем rescue Ruby-код не фиксирует эту ошибку:

#<ActiveResource::ResourceInvalid: Failed. Response code = 422. Response message = Unprocessable Entity.>

Это мой код:

begin
 ShopifyAPI::CarrierService.create(with some arguments)
rescue StandardError => e
  pp e
end

Это никогда не захватывает это. В моем разделе rescue я пробовал выше, но также:

 rescue Exception => e
 rescue ActiveResource::Errors => e

Все без удачи. Куда я сбился с пути?

Спасибо

EDIT: Это полная ошибка, это больше не информация, но здесь говорится:

#<ShopifyAPI::CarrierService:0x0000000357a0a0
 @attributes=
  {"name"=>"XXXX",
   "callback_url"=>
    "https://XX-XX-XX-XX.c9users.io/receive_rate_request",
   "format"=>"json",
   "service_discovery"=>"true",
   "carrier_service_type"=>"api"},
 @errors=
  #<ActiveResource::Errors:0x00000003578930
   @base=#<ShopifyAPI::CarrierService:0x0000000357a0a0 ...>,
   @messages={:base=>["you already have XXX set up for this shop"]}>,
 @persisted=false,
 @prefix_options={},
 @remote_errors=
  #<ActiveResource::ResourceInvalid: Failed.  Response code = 422.  Response message = Unprocessable Entity.>,
 @validation_context=nil>

Вот и все!

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Поскольку оно не вызывает исключение, если вы хотите вызвать исключение, когда ответ ложный, вам, возможно, придется использовать create with bang

begin
 ShopifyAPI::CarrierService.create!(with some arguments)
rescue StandardError => e
  pp e
end
0 голосов
/ 25 августа 2018

Согласно коду ActiveResource (lib / active_resource / base.rb):

# <tt>404</tt> is just one of the HTTP error response codes that Active Resource will handle with its own exception. The
# following HTTP response codes will also result in these exceptions:
#
# * 200..399 - Valid response. No exceptions, other than these redirects:
# * 301, 302, 303, 307 - ActiveResource::Redirection
# * 400 - ActiveResource::BadRequest
# * 401 - ActiveResource::UnauthorizedAccess
# * 403 - ActiveResource::ForbiddenAccess
# * 404 - ActiveResource::ResourceNotFound
...
# * 422 - ActiveResource::ResourceInvalid (rescued by save as validation errors)

Таким образом, это означает, что 422 были спасены с помощью сохранения при проверке, которое происходит при запуске .create, и вместо этого всплывают как ошибки проверки.

Глядя на lib / active_resource / validations.rb, вы видите, что исключение ResourceInvalid сожрано:

# Validate a resource and save (POST) it to the remote web service.
# If any local validations fail - the save (POST) will not be attempted.
def save_with_validation(options={})
  perform_validation = options[:validate] != false

  # clear the remote validations so they don't interfere with the local
  # ones. Otherwise we get an endless loop and can never change the
  # fields so as to make the resource valid.
  @remote_errors = nil
  if perform_validation && valid? || !perform_validation
    save_without_validation
    true
  else
    false
  end
rescue ResourceInvalid => error
  # cache the remote errors because every call to <tt>valid?</tt> clears
  # all errors. We must keep a copy to add these back after local
  # validations.
  @remote_errors = error
  load_remote_errors(@remote_errors, true)
  false
end

Так что мне интересно, регистрируется ли, что произошло исключение, но на самом деле не вызывает исключение, потому что оно превращает его в возвращаемое значение false. Он говорит «локальные проверки» в комментарии, но устанавливает remote_errors, поэтому не совсем понятно, где выполняется этот путь кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...