Estoy tratando de mejorar mis habilidades con Ruby detectando excepciones. Quiero saber si es común volver a generar el mismo tipo de excepción cuando tiene varias llamadas a métodos. Entonces, ¿tendría sentido el siguiente código? ¿Está bien volver a generar el mismo tipo de excepción o no debería detectarlo en el método de proceso?
class Logo
def process
begin
@processed_logo = LogoProcessor::create_image(self.src)
rescue CustomException
raise CustomException
end
end
end
module LogoProcessor
def self.create_image
raise CustomException if some_condition
end
end
begin @logo.process; rescue...
pero entonces no estaría detectando una excepción lanzada por el proceso en sí, sino de algo que ha sido llamado desde dentro del proceso. ¿Es correcto hacerlo?stacktrace
excepción original, probablemente desee incluir la excepcióncause
que está disponible en ruby> 2.1raise
de la manera de esta respuesta conserva la excepción original por completo, incluido elbacktrace
.cause
no se aplica a este caso. Por el contrario, se llena automáticamente cuando unrescue
bloque genera una nueva excepción.$!
variable global. Llamarraise
sin argumentos genera el error contenido en$!
, efectivamente levantando el último error. Sin embargo,raise error
generará el error contenido en laerror
variable local, que puede ser o no el mismo objeto contenido en$!
. En mi ejemplo,$!
es lo mismo queerror
. Sin embargo, también es posible hacer esto:error = Exception.new; raise error
Esto generará el mismo tipo de error que el original, pero puede personalizar el mensaje.
rescue StandardError => e raise e.class, "Message: #{e.message}"
fuente