2010-08-01 14 views
32

Można utworzyć podklasę wyjątku, aby była bardziej opisowa, ale jak ustawić domyślną "wiadomość"?Klasy błędów wyjątków Rubiego

class MyError < StandardError 
    # default message = "You've triggered a MyError" 
end 

begin 
    raise MyError, "A custom message" 
rescue Exception => e 
    p e.message 
end 

begin 
    raise MyError 
raise Exception => e 
    p e.message 
end 

Pierwszy powinien wypisać „niestandardowy komunikat”

Drugie wyjście powinno „pan wywołał MyError”

jakieś sugestie co do najlepszych praktyk?

Odpowiedz

57

Należy zdefiniować metodę inicjowania, która pobiera komunikat jako argument o wartości domyślnej. Następnie wywołaj metodę inicjowania StandardError za pomocą tego komunikatu (używając super).

class MyError < StandardError 
    def initialize(msg = "You've triggered a MyError") 
    super(msg) 
    end 
end 
+29

Wystarczy "super". Jeśli nazwiesz 'super' bez listy argumentów, po prostu przekaże wszystkie argumenty, dlatego, kiedy faktycznie chcesz przekazać * no * argumenty, musisz jawnie wywołać' super() '. –

+0

@ JörgWMittag Dlaczego wszystkie niestandardowe klasy błędów dziedziczą z 'StandardError'? Jakiś powód za tym? –

+0

@ArupRakshit Ponieważ jest bezpieczny. Za każdym razem, gdy uratujesz z błędami, powinno to być 'StandardError' (lub niższy), ponieważ błędy wyższego poziomu, takie jak' Exception', mogą być rzucane nawet podczas uderzania CTL-C itd. Zobacz więcej informacji http://rails-bestpractices.com/posts/2012/11/01/don-t-rescue-exception-rescue-standarderror – Sean

1

Można również zastąpić metodę w podklasie message i powrócić ciąg który ma być wyświetlany. Wolę to, ponieważ wydaje się, że wszystko jest trochę czystsze, jeśli chcesz zrobić coś interesującego przed wyświetleniem wiadomości.

class CustomError < StandardError 

    def initialize(error_code, error_info) 
    @code, @info = error_code, error_info 
    end 

    def message 
    "<Code: #{@code}> <Info: #{@info}>" 
    end 

end 
Powiązane problemy