2010-09-08 3 views
10

Dites que je veux qu'un appel soit lancé, et s'il échoue, ce n'est pas grave; le programme peut continuer sans problème. (Je sais que cette pratique est généralement mauvaise, mais imaginez un hypothétique scénario rapide unique, et non pas un grand projet)Avoir un bloc/une commande Ruby échouer silencieusement sans un bloc 'rescue' vide

La façon dont je l'ai appris à faire était:

begin 
    thing_to_try 
rescue 
    # awkward blank rescue block 
end 
next_thing 

Bien sûr, il existe d'autres façons de le faire, y compris en utilisant ensure et des choses comme ça. Mais existe-t-il un moyen de faire échouer silencieusement un appel/bloc de méthode sans un bloc vide?

Répondre

10

Une méthode comme celle-ci peut être 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 

Vous pouvez définir cette méthode à l'intérieur de class Object pour la disponibilité universelle.

Vous pouvez alors écrire:

squelch { foo } || squelch { bar } 

Le véritable avantage d'avoir cette approche est que vous pouvez utiliser des blocs multilignes, car en ligne rescue ne peut être utilisé sur une seule déclaration.

+0

Par curiosité, votre utilisation de l'échantillon agit-elle également comme un début/sauvetage? –

+0

@Justin L .: Je ne sais pas si cela répond à votre question, mais il n'y a pas 'begin' parce que je récupère l'appel de' squelch'. En d'autres termes, le mot clé 'def' est un' begin' implicite. – wuputah

+0

Je veux dire, votre 'squelch {foo} || squelch {bar} '; agit-il de la même manière que 'commence foo; barre de sauvetage; fin'? –

17

C'est la même idée, mais un peu moins bavard, mais vous pouvez utiliser la syntaxe en ligne

thing_to_try rescue nil 
next_thing 
+0

Ceci est probablement le plus concis et utile pour un script court; c'est celui que j'utilise actuellement pour ma situation actuelle =) Mais l'autre réponse semble plus élégante pour les projets dans le futur que je pourrais vouloir cela d'une manière ou d'une autre. –

1

En plus de l » idée de Ben, vous pouvez également créer une fonction pour 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 
Questions connexes