2011-01-24 26 views
7

Bir Ruby komut dosyasında "komut bulunamadı" hatası yakalamanın bir yolu var mı? Örneğin, verilen:Ruby'nin backtick'lerinden "komut bulunamadı" hatalarını yakalama?

output = `foo` 

nasıl tuzağa foo yüklenmemiş durum do? Ben rescue bir istisna olabilir, ancak bu 1.8.7 üzerinde çalışmak için görünmüyordu. İstediğimi yapacak alt işlemi çağırmanın farklı bir yolu var mı? Yoksa farklı bir yaklaşım var mı?

Benim özür

Güncelleme, ben gizli bir gereklilik söylemeyi unutmuşum: Ben tercüman dolayısıyla neden istisna, (o hassas verileri içerebilir) kullanıcıya komut satırını akmaması tercih ediyorum yakalama yöntemi tercih edilir. Bunu ilk defa bıraktığımız için tekrar özür dilerim.

+0

Bir taktik olduğunu Çalıştırmaya çalışmadan önce bir ön kontrol-çalışma, özelliği veya uygulamayı veya kodu arayarak çalıştırmak için. Dosyanın varlığını ve çalıştırılabilirliğini aramak için hangi 'foo' 'ya da bir çift Dosya sınaması kullandığınızı söyleyerek, komutun gerçekten denemesine ve başarısızlığa uğramaya devam etmenin güvenli olup olmadığını söyleyecektir. Bu, daha iyi bir kullanıcı deneyimi sağlar, çünkü eksik işlevselliğe nasıl tepki verdiğinizi kontrol edebilir ve alternatif bir rotaya gidebilir veya bir şey eksik olduğu için devam edemeyeceğiniz kullanıcıyı bilgilendirebilirsiniz. –

+0

Anlaştık, ancak 'foo' 'çapraz platform değil ve bunu denemek ve hatayı yakalamaktan başka bir şey yapmak için bir çapraz platform yolu düşünemedim ... – kfb

cevap

13

Dönüş kodunu kullanın!

irb(main):001:0> `date` 
=> "Mo 24. Jan 16:07:15 CET 2011\n" 
irb(main):002:0> $? 
=> #<Process::Status: pid=11556,exited(0)> 
irb(main):003:0> $?.to_i 
=> 0 
irb(main):004:0> `foo` 
(irb):4: command not found: foo 
=> "" 
irb(main):005:0> $?.to_i 
=> 32512 

http://corelib.rubyonrails.org/classes/Process/Status.html STDOUT

Yönlendirme STDERR sadece dışarı şişkinlik size dönüş değeri olarak çıktı yerine verecektir

: Belirli bir özellik gerektiğinde yararlıdır

irb(main):010:0> `foo 2>&1` 
=> "sh: foo: not found\n" 
irb(main):011:0> $?.to_i 
=> 32512 
+0

Teşekkürler! Bununla birlikte, komut satırını geri sızmamaya dair ekstra bir gereklilikten bahsetmeyi unuttum; Eğer doğru anlarsam, bu hala kullanıcıya mesaj bulunmayan komutu gösterecektir. – kfb

+0

Yanıtımıma nasıl yapılacağına bir örnek ekledim. –

+0

Bir çekicilik gibi çalışır! Teşekkürler! – kfb