2012-06-22 1 views
0

Я подключаю наше приложение Rails (3.2) к внешней веб-службе (монитору кампании), которая требует нескольких вызовов в свою систему для установки клиента.Работа с пользовательскими кодами исключений из отказавшего вызова API

Я поместил каждое действие в отдельные блоки спасения и завернул в транзакцию, но все выглядит не так хорошо. Мне нужно, чтобы он сбежал после каждой ошибки и отобразил правильное сообщение. В настоящее время он просто убегает.

У меня есть список возможных ошибок за действие - как можно их прочитать и форматировать как флэш-сообщение?

Например, следующее сообщение об ошибке:

CreateSend::BadRequest: The CreateSend API responded with the following error - 172: You can create a maximum of five (5) clients per thirty (30) minutes 

настоящее время у меня это в моем контроллере:

def create_send_setup 
    ... 
     begin 

     client = CreateSend::Client.create(@user.company_name, @user.username, @user.email, "(GMT) Dublin, Edinburgh, Lisbon, London", @user.country) 

     rescue 
     flash[:notice] = "Uh oh, there's been a problem. Please try again. Client" 
     end 

     begin 
     @client = CreateSend::Client.new(@user.createsend_client_api) 
     @client.set_access(@user.username, @password, @user.createsend_access_level) 
     @client.set_monthly_billing(@user.createsend_currency, true, @user.createsend_markup) 

     rescue 
      flash[:notice] = "Uh oh, there's been a problem. Please try again. Access" 
     end 

      flash[:notice] = "Great, now you just need to choose a plan" 
      redirect_to edit_user_registration_path  

end 

В предыдущей интеграции, я использовал что-то вроде

case bla.code.to_s 
    when /2../ 
    when '403' 
     raise "Could not update subscriber: new-customer-id is already in use." 
    ... 
end 

Каков наилучший способ извлечения кода ошибки из ответа и отображения в виде флэш-сообщения?

ответ

1

Как сказал Дейв, если исключение все у вас есть, вы можете только фиксировать исключение и делать что-то с этим исключением в виде строки.

Например:

begin 
    ... 
rescue Exception => ex 
    # here "ex.message" contains your string, you can do anything you want with it 
    # or parse as is: 
    flash[:notice] = ex.message 
end 

redirect_to edit_user_registration_path 

UPDATE

Если объединить предложенное мое решение с теми, выдвинутым Дэйвом, вы получите что-то вроде этого, с помощью которого вы можете использовать свои собственные ошибки строки:

begin 
    ... 
rescue Exception => ex 
    code = ex.message.match(/.*?- (\d+): (.*)/)[1] 

    case code 
    when '172' 
    flash[:notice] = 'Please wait 30 minutes to create more clients' 
    end 
end 

redirect_to edit_user_registration_path 
+0

спасибо, посмотрим – simonmorley

+0

есть ли другой способ получить исключение? В настоящее время это дает мне «неопределенный метод' match 'для # " – simonmorley

+0

Извините, вам нужно позвонить' match' на 'ex.message', а не' ex'. Обновлен мой ответ. – JeanMertz

2

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

Например, если пример сообщение, которое вы показать нормализуется, регулярное выражение может быть использован для захвата цифровых и сообщений частей:

[1] pry(main)> s = "CreateSend::BadRequest: The CreateSend API responded with the following error - 172: You can create a maximum of five (5) clients per thirty (30) minutes" 
=> "CreateSend::BadRequest: The CreateSend API responded with the following error - 172: You can create a maximum of five (5) clients per thirty (30) minutes" 
[2] pry(main)> md = s.match /.*?- (\d+): (.*)/ 
=> #<MatchData 
"CreateSend::BadRequest: The CreateSend API responded with the following error - 172: You can create a maximum of five (5) clients per thirty (30) minutes" 
1:"172" 
2:"You can create a maximum of five (5) clients per thirty (30) minutes"> 
[3] pry(main)> md[1] 
=> "172" 
[4] pry(main)> md[2] 
=> "You can create a maximum of five (5) clients per thirty (30) minutes" 
+0

Hi Dave. Любой шанс вы могли бы направить меня к примеру. Я не знаю, как получить эту информацию в формате и т. Д. S – simonmorley

+0

@simonmorley Обновленный ответ, чтобы включить пример с использованием регулярного выражения. Это решение может быть адекватным, если все сообщения из исключения находятся в одном и том же (или аналогичном) формате. –

+0

большое спасибо, позвольте мне играть сейчас :) – simonmorley

0

Лучший способ обработки ошибок в этой конкретной ситуации - это, в частности, передача ошибок, которые библиотека определяет себя. createdend-ruby определяет CreateSendError, BadRequest и Unauthorized. Вам не нужно разбирать строки.

Вот пример взять из README, обработки ошибок:

require 'createsend' 

CreateSend.api_key 'your_api_key' 

begin 
    cl = CreateSend::Client.new "4a397ccaaa55eb4e6aa1221e1e2d7122" 
    id = CreateSend::Campaign.create cl.client_id, "", "", "", "", "", "", "", [], [] 
    puts "New campaign ID: #{id}" 
    rescue CreateSend::BadRequest => br 
    puts "Bad request error: #{br}" 
    puts "Error Code: #{br.data.Code}" 
    puts "Error Message: #{br.data.Message}" 
    rescue Exception => e 
    puts "Error: #{e}" 
end 

Поле data всегда содержит Code и Message, которые соответствуют status codes API documentation.