Dostep do metody z wewnątrz klasy wyjątku

mam swój logger

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.

W razie czego, do loggera możesz się dostać z każdego miejsca używając:

Rails.logger.info "yo"

ale tak jak napisał bragi - lepiej złapać wyjątek i tam użyć loggera, później możesz go jeszcze raz rzucić używając raise bez argumentów:

begin raise FooError rescue FooError Rails.logger.info "foo" raise #rzuci ten wyjątek, który został złapany end

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

  1. 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ść

  1. 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