Aradaki fark nedir - teknik, felsefi, kavramsal veya başka türlü -
raise "foo"
ve
raise Exception.new("foo")
?
Aradaki fark nedir - teknik, felsefi, kavramsal veya başka türlü -
raise "foo"
ve
raise Exception.new("foo")
?
Yanıtlar:
Teknik olarak, birincisi, mesaj olarak ayarlanmış bir RuntimeError hatası "foo"
, ikincisi ise mesaj olarak ayarlanmış bir İstisna oluşturur "foo"
.
Pratik olarak, ilkini ne zaman kullanmak isteyeceğinizle ikincisini ne zaman kullanmak istediğiniz arasında önemli bir fark vardır.
Basitçe söylemek gerekirse, muhtemelen bir RuntimeError
değil Exception
. Bağımsız değişken içermeyen bir kurtarma bloğu RuntimeErrors
s'ları yakalayamaz Exception
. Dolayısıyla Exception
, kodunuzda bir yükseltirseniz , bu kod onu yakalamayacaktır:
begin
rescue
end
Yakalamak için şunu Exception
yapmanız gerekecek:
begin
rescue Exception
end
Bu, bir anlamda, Exception
a'nın "daha kötü" bir hata olduğu anlamına gelir RuntimeError
çünkü ondan kurtulmak için daha fazla iş yapmanız gerekir.
Hangisini istediğiniz, projenizin hata işlemesini nasıl yaptığına bağlıdır. Örneğin, arka plan yordamlarımızda, ana döngü, RuntimeErrors
onları yakalayacak , rapor edecek ve sonra devam edecek boş bir kurtarmaya sahiptir . Ama bir veya iki durumda, arka plan programının gerçekten bir hata nedeniyle ölmesini istiyoruz ve bu durumda Exception
, doğrudan "normal hata işleme kodumuzdan" geçen ve çıkan bir anı yükseltiriz .
Ve yine, eğer kütüphane kodu yazıyorsanız, muhtemelen a RuntimeError
değil, istersiniz Exception
, çünkü kütüphanenizin kullanıcıları boş bir rescue
bloğun yakalayamayacağı hatalar ortaya çıkarsa şaşıracak ve nedenini anlamaları biraz zaman alacaktır.
Son olarak, RuntimeError
sınıfın bir alt sınıfı olduğunu söylemeliyim StandardError
ve gerçek kural, raise
herhangi bir tür nesneyi yapabilmenize rağmen , boşluk rescue
varsayılan olarak yalnızca miras alan her şeyi yakalayacaktır StandardError
. Geri kalan her şey özel olmalıdır.
StandardError
. Birkaç satırdan daha karmaşık olmak zorunda değil class MissingArgumentsError < StandardError; end
.
raise
raise( string )
raise( exception [, string [, array ] ] )
Hiçbir argüman olmadan, istisnayı $!
yükseltir veya bir RuntimeError
if $!
is nil'i yükseltir . Tek bir String
bağımsız değişkenle, bir RuntimeError
dizge ile bir mesaj olarak a yükseltir . Aksi takdirde, ilk parametre bir Exception
sınıfın (veya Exception
gönderildiğinde istisna döndüren bir nesnenin) adı olmalıdır . İsteğe bağlı ikinci parametre, istisna ile ilişkili mesajı ayarlar ve üçüncü parametre, bir geri arama bilgileri dizisidir. İstisnalar, begin...end
blokların kurtarma hükmü tarafından yakalanır .
raise "Failed to create socket"
raise ArgumentError, "No parameters", caller
RuntimeError < StandardError < Exception
[2] Bu nedenle, kod, ikinci bloğu o olacak bir özel durum ve RuntimeError [3] hem yakalamak "Çıplak" yükseltme ve kurtarmanın söz konusu İstisna [4] ile çalışması ilginç / tuhaftır belki de temel kural RuntimeError'ı istemci koduna yükseltmek, ancak kişinin kendi kodunun içindeki kendi özel İstisnalarını yükseltmek ve kurtarmaktır?