2010-03-03 18 views
10

Większość moich aplikacji ma wiele wspólnego z usługami internetowymi i często ze względu na stronę trzecią, mam problemy z przekroczeniem limitu czasu.Jak ratować problemy z limitem czasu (Ruby, Rails)?

Jest to błąd, który pojawia się:

execution expired 
    /usr/lib/ruby/1.8/timeout.rb:54:in `rbuf_fill' 

Jak mogę uratować ten rodzaj błędu w aplikacji Rails?

Odpowiedz

28

W zależności od sposobu korzystania z biblioteki, istnieją różne sposoby ratowania wyjątek.

W bibliotece

Zakładając, że stworzyła opakowanie dostępu do jakiegoś serwisu WWW, można mieć obwoluta ratowania wyjątek i zawsze powrócić do „bezpiecznych” dane.

W akcji

Jeśli zadzwonisz specyficzna metoda działania i sukces metoda jest wymogiem dla działania, można uratować go w akcji. W poniższym przykładzie uratowałem błąd i pokazałem konkretny szablon, aby poradzić sobie z problemem.

def action 
    perform_external_call 
rescue Timeout::Error => e 
    @error = e 
    render :action => "error" 
end 

W regulatorze

Jeśli wywołanie metody mogą występować w wielu różnych działań, może chcesz używać rescue_from.

class TheController < ApplicationController 

    rescue_from Timeout::Error, :with => :rescue_from_timeout 

    protected 

    def rescue_from_timeout(exception) 
    # code to handle the issue 
    end 

end 
2

to, co robię w moich szyn apps:

# in ApplicationController 
rescue_from Your::Exception, :with => :handle_exception 

protected 

def handle_exception 
    # do anything you want here 
end 

Można określić wyjątek jak byś zrobił w klauzuli ratowniczej oczywiście.

Pozdrowienia, Joe

+1

Nigdy uratować 'Exception'. To zły nawyk programowania. Powinieneś uratować określone wyjątki lub przynajmniej "StandardError". –

+1

"Wyjątek" miał na celu wyjaśnienie, gdzie można złapać konkretną, ale masz rację, to powinno być wyraźniejsze! :) – xijo

+0

W pewnym sensie wiedziałem, jak to zrobić, gdy nie znaleziono ActiveRecord. Po prostu nie wiedziałem, co lub jak uratować ten konkretny błąd. – kgpdeveloper