Bir sistemin çökmesini önlemek için temelde istisnalar var mı?


16

İkincisi, birisinin istisnalar (istisna kontrol akışı alanında) ve İstisnalar (Java'da kullanılan gibi) arasındaki farkın ne olduğunu bilip bilmediğini merak ediyordum.

Ancak, temelde kullanıcı programını sonlandırarak sistemin çökmesini önlemek için oradalar mı?

Yanıtlar:


29

Kilitlenmeleri önleyebilen ancak daha genel olarak istenmeyen veya öngörülemeyen sistem davranışlarını önleyen İstisna İşleme izin vermek için istisnalar vardır . Örneğin, programımın bir veritabanıyla bağlantısı zaman aşımına uğrarsa, genellikle sistem çökmez, ancak veritabanındaki verilere bağlı olsaydım, bir istisna bu veri içermeyen durumu normalden farklı şekilde ele almama izin verebilir.

Diyelim ki benim program veritabanından ne döndürülen dayalı bir veri sayfası görüntüler - iyi bok, veri yok. Dağınık bir görünüm sunmak veya potansiyel olarak geçersiz bir işlem sürdürmek yerine, bu istisnayı yakalayabilir ve farklı bir veritabanına geri dönebilir, yerel verilerden okuyabilir, kullanıcıdan veri isteyebilir veya kullanıcıyı veya sistemi güvenli bir duruma geri döndürebilirim (muhtemelen bir hemen aynı istisnayı yaratmaz!)

Kullanıcı girişinin bir soruna neden / çözüm olabileceği sistemlere ek olarak, istisnalar bir kullanıcının sorun hakkında ayrıntılı ve yardımcı bilgi vermesini sağlayabilir. Çok yaygın "İşlenmeyen bir kural dışı durum oluştu ..." veya "Doğrudan SQL'den Hata İletisini Gözden Geçirmek" yerine, kullanıcıya "B kaynağına bağlanamadı" gibi yararlı veya en azından anlaşılabilir bir şey söyleyebilirsiniz.


5
Bunun en doğru cevap olduğunu hissediyorum. Programlar iş yapan sonlu durum makineleridir. Makineyi, hatalı veriler vererek arızalanmasına neden olacak şekilde kırmanın yolları vardır. Bunu önlemek için istisnalar atılır. Bazen makine kendini kurtarabilir, ancak bazen canlayamaz.
Andy

1
Hata kodları ile aynı şeyi yapamaz mıydım? Bir hata döndürürsün ve ben hallederim.
mskw

16

Hata işlemeyi basitleştirmek için istisnalar oluşturuldu. İstisnalar olmadan, hata işleme mantığı bir uygulamaya yayılmalıdır. Hatayla sonuçlanabilecek herhangi bir işlev bir şekilde bir hata durumu döndürmeli ve her çağrıyı bir hata denetimi izlemelidir. Genellikle arayan hata durumunda yararlı bir şey yapamaz ve yalnızca bir hatanın kendisini döndürebilir. Uygulama kodunun yarısı hata işlemeye ayrılabilir. Böyle bir kod son derece kırılgandır. Bir hata kontrolü ve çökmesi ya da daha da kötüsü, fark edilmeyen bir hata nedeniyle yanlış sonuçlar döndürmek çok kolaydır.

İstisnalar dışında, hatalar yalnızca ele alınabilecekleri noktada kontrol edilebilir. Çoğu uygulama kodu düz çizgi biçiminde yazılabilir, çünkü işlevler kullanılabilir bir değer döndürür veya bir istisna atar.


5

İstisna konusu kullanıcıyı istisnai durumlar hakkında bilgilendirmek olmalıdır. Sistemde bir şeyler ters giderse, programın uygun şekilde işlemesine * izin vermesi * gerekir.

Bununla birlikte, hayır, sistemin "çökmesini" önlemek için bir istisna yoktur. Bir sorun olduğunu bana bildiren bir istisna. Nasıl devam edeceğini belirler sistemi "çöküyor" belirleyebilir.

Ayrıca, bir özel durumun, bir uygulamayı söylediğin gibi sonlandırmak zorunda olmadığını da unutmayın. Bir istisna programcı tarafından işlenebilir ve düzeltilebilir veya kullanıcı için anlamlı bir hataya dönüşebilir.


* İşaretli istisnaların (yakalanmaya zorlanan istisnalar) kullanımı biraz ağrılı bir noktadır. Bazı (belki de çoğu) geliştirici, zorla istisna işlemenin hantal, gereksiz ve sadece kötü bir uygulama olduğunu düşünmektedir.


2
Kabul etmiyorum, bu tanım çok sınırlı. Kullanıcıya yalnızca istisnaların bir alt kümesi gösterilmelidir. İstisnalar hata işleme içindir ve kullanıcıyı bırakmak ve bilgilendirmek genellikle atılan son adımdır ve norm olmamalıdır. Bazı sistemler, yinelenebilir sonu, EOF, vb.Gibi bazı akış kontrolü türlerinde de istisnalar kullanmak üzere tasarlanmıştır
Jürgen Strobel

Jürgen, yorumunu anlıyorum ve tamamen katılıyorum. “düzeltildi veya anlamlı bir hataya dönüştü”

Evet, şimdi çok daha iyi.
Jürgen Strobel

Muhtemelen, istisnalar asla kullanıcılara gösterilmemelidir. (Bunların oluşturulmasına neden olan koşulların bir şekilde istisna olarak değil, kullanıcılara bildirilmesi gerekebilir.) Ancak, bir istisna her zaman sadece bir DIAF veya sürpriz çıkış yapan programdan daha iyidir. (“E-postamı gönderenin adına göre sıralamaya çalıştığımda, e-posta istemcisi sessizce çıkar !!” Bu çıkış ne kadar temiz olursa olsun, yine de yanlıştır.)
Donal Fellows

2

Özel durumlar, hata konumunu hata işleyicisinden ayırarak modern hata işlemeye izin verir. Bazen bu akış kontrolü için de kullanılır.

İşlenmeyen istisnalar bir programı sonlandırır. Ancak bunlar önceki istisnalardan farklı değildir, sadece her yola uygun hata işleyicilerini dahil etmeyi unutturan tembel bir programcı onları son kullanıcı tarafından görülebilir hale getirir. İstisna ile sona eren bir programın beklenmedik diğer uçlarla aynı şekilde çöktüğünü düşünüyorum.

İşletim sistemleri, nasıl çöktüklerine bakılmaksızın, çökmüş işlemleri temizlemek çok iyidir, bu nedenle istisnalar, işletim sistemi için arızalı işlemleri sonlandırmak ve kaynaklarını serbest bırakmaktan başka bir şekilde güvenlik sağlamaz.


Bir İşletim Sisteminin temizleyebileceği sınırlar vardır. Genel olarak, bir işletim sistemi kalıcı kaynakların (örn. Dosyalar) temizlenmesi veya geri alınması gerekip gerekmediğini veya yerel bir bağlantıyı kapatmanın ötesinde uzak bir bağlantı için herhangi bir temizleme gerekip gerekmediğini bilemez.
8bittree

2

Çok basit.

  • Tüm sistemi değil, sadece programı çökertmek için - [iyi] İşletim Sistemlerimiz var.
  • Ölümcül bir hatayı yoksaymak yerine bir programı çökertmek için - istisnalarımız var.

İstisnalar icat edilmeden önce, her fonksiyon bir çıkış kodu (hata / başarı) döndürmek zorundaydı ve fonksiyondan herhangi bir sonuç veya çıktı , ayarlanacak belleğe bir işaretçi iletilerek alınmak zorundaydı.

Sorun, birçok programcının her bir işlev için hatalı çıkış kodlarını kontrol etmeyi hatırlamaması / rahatsız etmemesi ve bu nedenle ölümcül hataların bazen göz ardı edilmesi, oldukça açıklanamayan davranışlara yol açmasıydı.

Bu nedenle, karar verildi - dikkate almadığınız bir hata oluştuğunda, hemen çökün! AKA İstisna Yönetimi.


1

İstisnalar basitçe bir hata tespit mekanizmasıdır. Kendi başlarına hiçbir işe yaramazlar.

Ancak bir hatayı tespit ederek, hatasız bir duruma (önceki bir durum veya yeni bir duruma) geçerek hatalı durumdan kurtulmak için hata tolerans mekanizmalarını tetiklemeye izin verirler. Bu şekilde, hata sistemin diğer bölümlerine yayılmaz.


0

İstisnaları için var , normal bir program akışını ayırmak den (program yapmak için tasarlanmıştır ne) hata işleme akımı (nasıl programı istisnai durumdan kurtarmak için çalışıyor).

Bu, kodu daha net ve bakımını kolaylaştırır.

İki kod sniplet'ini düşünün:

try:
    do1()  # this is obvoiusly a normal
    do2()  # program flow
except:
    oups()  # this is exception handling code

Buna kıyasla:

if foo():
    thing1()  # is this part of normal program flow?
else:
    thing2()  # or maybe this one? Or both? When?

Elbette, programın çökmesini önlemek için kural dışı durum işleme kullanılabilir:

try {    // very bad code
    my();
    whole();
    ugly();
    application();
    here();
} catch (Throwable t) {
    // pretend it's ok
}

ancak modern programlama dillerindeki istisnaların nedeni bu değildir.

Ayrıca kullanabilirsiniz whileve breakyerine ifama bu ne için whileve değil break.


Aslında "anormal" kontrol akışının işlenmesi tam olarak goto ve onun arkadaş kırılması en faydalı olanlardır. İstisnaların avantajı, fonksiyon sınırlarını aşabilmeleri ve arayan kişinin onu yakalamak için en uygun yeri belirleyebilmesidir.
hugomg

@hugomg: İstisnaların bir diğer büyük avantajı, kaynak temizliğinin ve bu tür diğer eylemlerin bir istisnanın atıldığı yer ile işlendiği yer arasında gerçekleştirilmesine izin vermesidir.
supercat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.