2010-09-08 17 views
10

Digamos que quiero que se ejecute una llamada, y si falla, no es gran cosa; el programa puede continuar sin problemas. (Sé que esto es generalmente una mala práctica, pero imagino una rápida secuencia de comandos hipotética, de una sola vez, y no un gran proyecto)Tener un bloque/comando de Ruby falla silenciosamente sin un bloque de 'rescate' en blanco

La forma en que me han enseñado a hacer esto fue:

begin 
    thing_to_try 
rescue 
    # awkward blank rescue block 
end 
next_thing 

Por supuesto, hay otras formas de hacerlo, incluido el uso de ensure y cosas por el estilo. Pero, ¿hay alguna manera de conseguir que un método call/block falle silenciosamente sin un bloque en blanco desordenado?

Respuesta

10

Un método como este puede ser útil.

def squelch(exception_to_ignore = StandardError, default_value = nil) 
    yield 
rescue Exception => e 
    raise unless e.is_a?(exception_to_ignore) 
    default_value 
end 

Es posible definir este método en el interior class Object disponibilidad universal.

entonces usted puede escribir:

squelch { foo } || squelch { bar } 

La verdadera ventaja de tener este enfoque es que se puede utilizar bloques de varias líneas, ya que en línea rescue sólo se puede utilizar en una sola sentencia.

+0

Por curiosidad, ¿su uso de muestra también actúa como un comienzo/rescate? –

+0

@Justin L .: No estoy seguro de si esto responde a su pregunta, pero no hay 'comenzar' porque estoy rescatando la llamada al método completo de' squelch'. Para decirlo de otra manera, la palabra clave 'def' es un' begin' implícito. – wuputah

+0

Quiero decir, tu 'squelch {foo} || squelch {bar} '; ¿actúa de la misma manera que 'begin foo; barra de rescate; fin'? –

17

Es la misma idea, pero un poco menos detallado, pero se puede utilizar la sintaxis de línea

thing_to_try rescue nil 
next_thing 
+0

Esto es probablemente el más conciso y útil para una secuencia de comandos corta; es el que estoy usando para mi situación actual =) Pero la otra respuesta parece más elegante para proyectos en el futuro que podría querer de alguna manera. –

1

Además de la idea Ben 's, también puede crear una función para la que

def suppress_errors(&block) 
    begin 
    yield 
    rescue 
    # awkward blank rescue block 
    end 
end 

# call it  
suppress_errors {puts "abc"} 
suppress_errors do 
    puts "xyz" 
end 
Cuestiones relacionadas