2011-12-05 14 views
11

Vengo de un fondo C# donde suelo volver a plantear excepciones con la excepción original contenida dentro de la excepción padre. ¿Hay un concepto similar disponible en Ruby? ¿Cómo puedo detectar y generar una excepción mientras mantengo el contexto de la excepción de nivel inferior?ruby ​​- excepción de re-raise con la sub-excepción

Respuesta

14

Tome un vistazo a los trucos de la charla Exceptional Ruby por Avdi Grimm:

class MyError < StandardError 
    attr_reader :original 
    def initialize(msg, original=nil); 
    super(msg); 
    @original = original; 
    end 
end 
# ... 
rescue => error 
    raise MyError.new("Error B", error) 
end 
+0

No tiene que incluir msg como argumento en do super (msg). Si levanta MyError (error), 'algún mensaje' con esos cambios, 'algún mensaje' se pasará como un argumento implícito. – daremkd

4

Es posible extender StandardError:

class StandardError 
    attr_accessor :original 
end 

y cuando levanta una excepción, acaba de establecer esta propiedad:

def reraise ex, original 
    ex.original = original 
    raise ex 
end 

rescue StandardError => e 
    reraise ArgumentError.new('Message'), e 
end 

Con este enfoque, podrá elevar el rubí estándar rors y establecer el error principal para ellos, no solo sus errores personalizados.

Cuestiones relacionadas