2010-09-08 7 views
10

Powiedz, że chcę, aby wywołanie zostało uruchomione, a jeśli się nie powiedzie, to nic wielkiego; program można kontynuować bez problemu. (Wiem, że to jest na ogół złe praktyki, ale wyobrazić sobie hipotetyczną, szybki skrypt jednorazowe, a nie duży projekt)Posiadanie bloku/polecenia Ruby po cichu kończy się niepowodzeniem bez pustego bloku "ratunkowego"

Droga ja uczono robić to było:

begin 
    thing_to_try 
rescue 
    # awkward blank rescue block 
end 
next_thing 

Oczywiście istnieją inne sposoby, aby to zrobić, w tym używanie ensure i podobnych rzeczy. Ale czy istnieje sposób, aby wywołać/zablokować metodę, aby po cichu zawieść bez bałaganu pustego bloku?

Odpowiedz

10

Ta metoda może być pomocna.

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

Użytkownik może zdefiniować tę metodę w zakresie uniwersalnej dostępności pod numerem class Object.

Następnie można napisać:

squelch { foo } || squelch { bar } 

Prawdziwą zaletą posiadania tego podejścia jest to, można użyć multilinii bloków, ponieważ inline rescue może być używany tylko na jednym rachunku.

+0

Z ciekawości, czy użycie próbki działa również jako start/ratowanie? –

+0

@Justin L .: Nie jestem pewien, czy to odpowiada na twoje pytanie, ale nie ma "początku", ponieważ ratuję całą metodę wywołania 'squelch'. Innymi słowy, słowo kluczowe "def" jest niejawnym 'begin'. – wuputah

+0

Mam na myśli, twój 'squelch {foo} || squelch {bar} '; działa tak samo, jak 'begin foo; pasek ratowniczy; koniec "? –

17

To ten sam pomysł, ale trochę mniej gadatliwy, ale można użyć inline składni

thing_to_try rescue nil 
next_thing 
+0

Jest to prawdopodobnie najbardziej zwięzły i przydatny krótki skrypt; to ta, której aktualnie używam w mojej obecnej sytuacji =) Ale druga odpowiedź wydaje się bardziej elegancka dla projektów w przyszłości, że mogę tego chcieć w jakiś sposób. –

1

Oprócz pomysłu Ben „s, można również utworzyć funkcję dla tego

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 
Powiązane problemy