2015-12-28 4 views
1

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

tries = 0 
begin 
    tries += 1 
    <code> 
rescue Foo::Bar => e 
    case e.to_s 
    when 'More specific timeout error message' 
    retry unless tries >= 5 
    else 
    # Let me see other error messages 
    log.info("Error: #{e.to_s}") 
    end 
end 
+0

Вы уверены, что тайм-аут поднимается с использованием класса исключения общего назначения вместо его собственного класса, такого как Timeout :: Error? –

+0

Да, поэтому ошибка исходит из внешней библиотеки, время от времени время от времени и возвращает общую ошибку внешних библиотек с сообщением о тайм-ауте. – CarlyL

ответ

0

Посмотрите на retriable gem. Это похоже на то, что вы предлагаете. Обычно вы можете избавиться от определенного типа ошибки, но retriable также дает вам возможность спасения на основе сообщения об ошибке.

begin 
    Retriable.retriable on: { Foo::Bar => /More specific timeout error message/ }, tries: 3 do 
    # will retry if an error of type Foo::Bar is raised 
    # and its message matches /More specific timeout error message/ 

    # code here... 
    end 
rescue => e # rescue for everything else 
    puts e.message # same as e.to_s 
end 
3

Вы можете использовать несколько rescue, чтобы обрабатывать различные ошибки.

begin 
    # DO SOMETHING 
rescue Net::Timeout => e # change it to the error your want to catch, check the log. 
    # handle it 
rescue SyntaxError => e # just an example 
    # handle it 
rescue => e # any error that not catch by above rescue go here. 
    # handle it 
end 

Подробнее: http://phrogz.net/programmingruby/tut_exceptions.html

Вы можете попробовать Rollbar, это поможет сообщить об ошибке на производстве.