SORU
3 ŞUBAT 2010, ÇARŞAMBA


Başlar, Ruby ve Kurtarma Sağlamak?

Son zamanlarda Ruby programlama başladım ve İstisna işleme bakıyorum.

Eğer ensure C finally Ruby ile eşdeğer olup olmadığını merak ediyordum#? Olmalıdır:

file = File.open("myFile.txt", "w")

begin
  file << "#{content} \n"
rescue
  #handle the error here
ensure
  file.close unless file.nil?
end

ya da yapsam mı ki?

#store the file
file = File.open("myFile.txt", "w")

begin
  file << "#{content} \n"
  file.close
rescue
  #handle the error here
ensure
  file.close unless file.nil?
end

ensure eğer bir özel durum oluşturuldu olmasa bile ne olursa olsun denir, olur mu?

CEVAP
3 ŞUBAT 2010, ÇARŞAMBA


Evet, 13* *kod her zaman değerlendirilir sağlar. ensure deniyor. Java eşdeğerdir, ve C#'finally ler.

*/rescue/else/ensure/end *16 genel akış bu gibi görünüyor:

begin
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
rescue SomeOtherException => some_other_variable
  # code that deals with some other exception
else
  # code that runs only if *no* exception was raised
ensure
  # ensure that this code always runs, no matter what
end

rescue, ensure else dışında bırakabilirsiniz. Bu durumda özel durum işleme kodu dışında incelemek mümkün olmayacaktır değişkenleri dışında bırakabilirsiniz. (Eh, her zaman genel durum değişkeni oluşturuldu son durum erişmek için kullanabilirsiniz, ama bu biraz hacky.) Ve bu durumda StandardError devralan tüm özel durumları yakalanacak özel durum sınıfı dışında bırakabilirsiniz. (Lütfen bu demek değildir unutmayıntümözel durumlar Exception örnekleri ama StandardError olmayan istisnalar vardır, çünkü yakaladı. Çoğunlukla çok ciddi istisnalar uzlaşmanın bütünlüğü programı gibi SystemStackError, NoMemoryError, SecurityError, NotImplementedError, LoadError, SyntaxError, ScriptError, Interrupt, SignalException ya SystemExit.)

Bazı bloklar örtülü istisna taşlarını oluşturur. Örneğin, yöntem tanımları dolaylı olarak da özel bloklar, yazma yerine yani

def foo
  begin
    # ...
  rescue
    # ...
  end
end

sadece yazıyorsun

def foo
  # ...
rescue
  # ...
end

ya

def foo
  # ...
ensure
  # ...
end

Aynı class tanımlar module tanımlar için geçerlidir.

Ancak, hakkında soruyorsun belirli durumda, aslında çok daha iyi bir deyim vardır. Sonunda temizlemek için ihtiyacınız olan bazı kaynak ile çalışırken genel olarak, sizin için tüm temizleme yöntemi bir blok geçerek bunu. Bu kadar benzer using blok C# dışında Yakut aslında yeterince güçlü olduğunu bilmiyorsun daha beklemen yüksek rahiplerin Microsoft buraya gelen dağ ve nezaketle değiştirmek onların derleyici için. Ruby, sadece kendiniz uygulayabilirsiniz:

# This is what you want to do:
File.open('myFile.txt', 'w') do |file|
  file.puts content
end

# And this is how you might implement it:
def File.open(filename, mode='r', perm=nil, opt=nil)
  yield filehandle = new(path, mode, perm, opt)
ensure
  filehandle.close
end

Ve biliyor musun ne buzatenFile.open temel kütüphane mevcuttur. Ama genel bir desen kullanabileceğiniz kendi kodu için de uygulanması her türlü kaynak temizleme (à la using C#) veya işlemler veya başka ne olabilir düşünüyorum.

Bu ve kaynak edinme eğer serbest çalışmaz, yalnızca programın farklı bölümlerine dağıtılır. Ama eğer sizin örnekte olduğu gibi lokalize ise, o zaman kolayca bu kaynak bloklar kullanabilirsiniz.


BTW: C# using Ruby tarzı kaynak blok uygulayabilirsiniz çünkü aslında gereksiz olduğunu, kendinizi modern:

class File
{
    static T open<T>(string filename, string mode, Func<File, T> block)
    {
        var handle = new File(filename, mode);
        try
        {
            return block(handle);
        }
        finally
        {
            handle.Dispose();
        }
    }
}

// Usage:

File.open("myFile.txt", "w", (file) =>
{
    file.WriteLine(contents);
});

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bigapplemagic

    Bigapplemagi

    22 EYLÜL 2011
  • esnathesinger

    esnathesinge

    6 NİSAN 2009
  • Snazzy Labs

    Snazzy Labs

    9 Aralık 2008