2010-09-08 12 views
10

Bir çağrının yürütülmesini istiyorum ve başarısız olursa, önemli değil; Program problemsiz devam edebilir. (Bu genellikle kötü bir uygulama olduğunu biliyorum ama varsayımsal, hızlıca tek seferlik senaryoyu hayal değil, büyük bir proje)Bir Ruby bloğuna/komutuna sahip olmak, boş bir 'kurtarma' bloğu olmadan sessizce başarısız oluyor

Yapacak öğretildi yolu bu idi:

begin 
    thing_to_try 
rescue 
    # awkward blank rescue block 
end 
next_thing 

Tabii ki, ensure kullanımı ve bunun gibi şeyler de dahil olmak üzere bunu yapmak için başka yollar vardır. Ama dağınık bir boş blok olmadan sessizce başarısız bir yöntem çağrı/blok almak için bir yolu var mı?

cevap

10

Böyle bir yöntem yardımcı olabilir.

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

Evrensel kullanılabilirlik için bu yöntemi class Object içinde tanımlayabilirsiniz.

Sonra yazabilirsiniz: inline rescue sadece tek ekstresinde kullanılabilir beri bu yaklaşımı olan sen satırlı blokları kullanabileceği başka

squelch { foo } || squelch { bar } 

gerçek avantaj için.

+0

Merak etme, örnek kullanımınız da bir başlangıç ​​/ kurtarma görevi görüyor mu? –

+0

@Justin L .: Bu sorunun cevabını verip vermediğinden emin değilim, fakat 'başlangıç' diye bir şey yok çünkü tüm yöntem çağrısını 'susturma' kurtarıyorum. Başka bir deyişle, 'def' anahtar sözcüğü örtülü bir 'başlar'. – wuputah

+0

Yani, senin susturucunun {foo} || susturma {bar} '; foo başlar gibi aynı şekilde davranır; kurtarma çubuğu; bitti mi? –

17

Aynı fikir, ama biraz daha az ayrıntılı, ancak Ben 'in fikrine ek olarak satır içi sözdizimi

thing_to_try rescue nil 
next_thing 
+0

Bu, muhtemelen kısa bir senaryo için en özlü ve yararlıdır; Benim şu anki durumum için kullanıyorum: =) Diğer cevaplar, gelecekte bir şekilde bunu isteyebileceğim projeler için daha zarif görünüyor. –

1

kullanabilirsiniz, bunu da

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 
için bir işlev oluşturabilir
İlgili konular