2010-08-01 10 views
32

Puede crear una subclase de una excepción para hacerlo más descriptivo, pero ¿cómo debe establecer el 'mensaje' predeterminado?Excepción de Ruby, clases de error

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 

La primera es la Salida 'Un mensaje personalizado'

La segunda salida debe 'Usted ha desencadenado una MyError'

Cualquier sugerencia en cuanto a las mejores prácticas?

Respuesta

57

Define un método de inicialización, que toma el mensaje como un argumento con un valor predeterminado. Luego llame al método de inicialización StandardError con ese mensaje (usando super).

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

Just 'super' es suficiente. Si llama a 'super' sin una lista de argumentos, simplemente pasará todos los argumentos, por lo que, cuando realmente desee pasar * no * argumentos, debe llamar explícitamente a' super() '. –

+0

@ JörgWMittag ¿Por qué todas las clases de error personalizadas heredan de 'StandardError'? ¿Alguna razón detrás de esto? –

+0

@ArupRakshit Porque es seguro. Cada vez que se rescata de un error, debe ser un "StandardError" (o inferior), ya que los errores de nivel superior, como "Exception", pueden incluso lanzarse al golpear CTL-C, etc. Consulte esto para obtener más información http://rails-bestpractices.com/posts/2012/11/01/don-t-rescue-exception-rescue-standarderror – Sean

1

También puede sobrescribir el método message en la subclase y devuelve la cadena que le gustaría visualizar. Prefiero esto ya que parece mantener las cosas un poco más limpias si quieres hacer algo interesante antes de mostrar el mensaje.

class CustomError < StandardError 

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

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

end 
Cuestiones relacionadas