def logger
@logger ||= Logger.new(Rails.root.join("log/my.log"), shift_age = 'weekly')
@logger.formatter = Logger::Formatter.new
@logger
end
który używam jak zwykły railsowy, czyli logger.info … i chciałbym żeby tak zostało
W tej samej klasie mam własny wyjątek dla gemu SystemTimer
[code=ruby] class SynchronizationTimeout < Timeout::Error
attr_reader :action
def initialize(action = :list)
@action = action
logger.info "Timeout for #{@action}"
end
def to_s
"Timeout for #{@action}"
end
end[/code]
który wywołuje np tak
SystemTimer.timeout_after(100, Someclass::SynchronizationTimeout.new(:list)) do
zrób coś...
end
Niestety nie mam dostępu do metody logger w wyjątku, jak sie do tego dobrać ?
Wyjątek opisuje problem. Jego zadaniem nigdy nie powinno być logowanie. Logowanie wyjątku powinno znajdować się tylko i wyłącznie w miejscu gdzie jest łapany.
dzięki, podpiąłem łapanie wyjątków pod metodą, nie w środku, jest czytelniej moim zdaniem
def metoda_jakas
....
rescue MojaKlasa::SynchronizationTimeout
logger.info .....
end
Mam jeszcze inne pytania
Czy jest jakas metoda która wykonuje się zawsze w momencie wystąpienia przerwania, np mam takie przerwanie:
class SynchronizationTimeout < Timeout::Errore
def jakas_metoda
end
Chciałbym w takim przypadku sprawdzić pewną zmienną i w razie jej ustawienia wywołać inne przerwanie lub np zwrócić jakąś wartość
Czy jest jakiś odpowiednik rescue_from z Railsowych kontrolerów, który mogę użyć w swojej klasie, czyli mogę za jego pomocą ustawić globalnie co się ma dziać dla danego przerwania, a nie powielać blok rescue