2009-04-19 11 views
6

Czy istnieje biblioteka lub łatwy sposób przechwytywania wyjątków wyrzucanych w programie Ruby i rejestrowania go w pliku? Spojrzałem ponad log4r i logger, ale dokumenty na oba nie zapewniają żadnych przykładów, jak to zrobić. Zdalnie uruchamiam ten program i tracę uchwyty na stdout i stderr, jeśli ta informacja w ogóle pomaga.Automatyczne rejestrowanie wyjątków w Ruby

Co byś polecił?

Odpowiedz

14

Jeśli chcesz wybrać się na spacer po dzikiej stronie, spróbuj tego:

class Exception 
    alias real_init initialize 
    def initialize(*args) 
    real_init *args 
    # log the error (self) or its args here 
    end 
end 

to przechwyci tworzenie nowych obiektów wyjątków w momencie stworzenia.

+1

Dzięki Markus! Jeśli dzika strona działa, jestem bardziej niż chętny, aby to zrobić! –

+0

przegłosowano dla kreatywności! –

+4

To jest zabawne, ale byłbym bardzo ostrożny z Monkeypatching Exception ... –

4

Rescue from Exception. Coś jak to prawdopodobnie ma sens:

begin 
    # run your code here .. 
rescue Exception => exception 
    # logger.error(...) .... 
    raise exception 
end 

To będzie rejestrować wyjątek i ponownie podnieść go tak, że aplikacja faktycznie podnosi błąd oprócz logowania.

exception jest instancją Exception, spojrzeć na the docs informacji na temat tego, co można zrobić z tego obiektu (takie jak dostęp do ślad).

+1

Hmm, właśnie tego bałam się robić. Zaangażowany kod to w zasadzie jedna klasa z wieloma metodami; czy po prostu musiałbym rozpocząć/uratować każdą metodę, czy też jest łatwiejszy sposób? –

+0

Prawdopodobnie tworzysz gdzieś instancje - umieść blok ratunkowy w miejscu, w którym tworzysz instancje. –

+0

Umieszczenie go w kodzie tworzenia instancji nie przyniesie żadnego pożytku, chyba że błąd jest w kreacji. Jeśli chcesz uchwycić jakiekolwiek błędy globalnie, zawiń swoje główne ciało. – MarkusQ

2

Jeśli używasz aplikacji Rails, wtyczka Exception Notification jest bardzo przydatna.

+0

Ach tak, zdecydowanie to widziałem, ale moja aplikacja nie jest aplikacją Rails. W każdym razie dzięki! –

0

będzie działać, jeśli zrobiłem coś takiego:

begin 
    main() 
rescue Exception => e 
    myCustomErrorLogger(e) 
end 

def main() 
    # All the application code comes here. 
end 

Co potrzebne jest, aby wszystkie moje przechwycone wyjątki przejść na najwyższym, poziomie i złapać tam, a następnie rejestrowane przez rejestrowanie błędów funkcjonować.

Próbuję tego teraz, ale byłoby wspaniale mieć twoje sugestie.

0

Możesz zmodyfikować kod wyjątku klasowego w części, w której pojawia się przyczyna i ślad śledzenia.

Nie zapomnij sprawdzić, czy rejestrator może mieć wartość null, wyjątek można wyrzucić przed (lub podczas) utworzeniem rejestratora.