2010-09-08 16 views
10

Dire che voglio eseguire una chiamata, e se fallisce, non è un grosso problema; il programma può continuare senza problemi. (So ​​che questo è generalmente cattiva pratica, ma immagino una, rapido scritto una tantum ipotetica, e non un grande progetto)Avere un blocco/comando Ruby fallire in modo silenzioso senza un blocco vuoto 'rescue'

Il modo in cui mi è stato insegnato a fare questo è stato:

begin 
    thing_to_try 
rescue 
    # awkward blank rescue block 
end 
next_thing 

Naturalmente, ci sono altri modi per farlo, incluso l'uso di ensure e cose del genere. Ma c'è un modo per ottenere un metodo call/block per fallire silenziosamente senza un blocco vuoto disordinato?

risposta

10

Un metodo come questo può essere utile.

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

Si potrebbe definire questo metodo all'interno class Object la disponibilità universale.

Poi si può scrivere:

squelch { foo } || squelch { bar } 

Il vero vantaggio di avere questo approccio è che si può utilizzare blocchi più righe, in quanto in linea rescue può essere utilizzato solo su una singola istruzione.

+0

Per curiosità, l'utilizzo del campione funge anche da avvio/salvataggio? –

+0

@Justin L .: Non sono sicuro che questo risponda alla tua domanda, ma non c'è 'begin' perché sto salvando l'intera chiamata di metodo di' squelch'. Per dirla in altro modo, la parola chiave 'def' è implicita' begin'. – wuputah

+0

Voglio dire, il tuo "squelch {foo} || squelch {bar} '; agisce allo stesso modo di 'begin foo; barra di soccorso; fine'? –

17

E 'la stessa idea, ma un po' meno prolissa, ma è possibile utilizzare la sintassi inline

thing_to_try rescue nil 
next_thing 
+0

Questo è probabilmente il più conciso e utile per un breve script; è quello che sto effettivamente usando per la mia situazione attuale =) Ma l'altra risposta sembra più elegante per i progetti futuri che potrei desiderare in qualche modo. –

1

Oltre all'idea Ben s', è anche possibile creare una funzione per quel

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 
Problemi correlati