2010-08-01 16 views
32

Sie können eine Unterklasse einer Ausnahme erstellen, um es beschreibender zu machen, aber wie sollten Sie die Standard "Nachricht" einstellen?Ruby Exception Fehler Klassen

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 

Die erste Ausgabe sollte ‚Eine benutzerdefinierte Nachricht‘

Die zweite Ausgabe sollte ‚Du hast eine MyError ausgelöst‘

Irgendwelche Vorschläge als Best Practice?

Antwort

57

Definieren Sie eine Initialisierungsmethode, die die Nachricht als Argument mit einem Standardwert übernimmt. Rufen Sie dann die Initialisierungsmethode StandardError mit dieser Nachricht auf (mit super).

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

Nur 'super' ist genug. Wenn Sie 'super' ohne eine Argumentliste aufrufen, werden alle Argumente einfach übergeben. Wenn Sie also * no * Argumente übergeben wollen, müssen Sie explizit 'super()' aufrufen. –

+0

@ JörgWMittag Warum erben alle benutzerdefinierten Fehlerklassen von 'StandardError'? Irgendein Grund dahinter? –

+0

@ArupRakshit Weil es sicher ist. Wann immer vor Fehlern gerettet wird, sollte es ein 'StandardError' (oder niedriger) sein, da höhere Fehler wie' Exception' sogar ausgelöst werden können, wenn CTL-C usw. getroffen wird. Weitere Informationen finden Sie unter http://rails-bestpractices.com/posts/2012/11/01/don-t-Rettung-Ausnahme-Rettung-Standarderror – Sean

1

können Sie auch die message Methode in der Unterklasse überschreiben und geben die Zeichenfolge, die Sie angezeigt haben möchten. Ich bevorzuge dies, da es die Dinge ein wenig sauberer zu halten scheint, wenn Sie etwas Interessantes vor dem Anzeigen der Nachricht machen wollen.

class CustomError < StandardError 

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

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

end