Yeni Programcılara İstisna İşleme Nasıl Öğretilir? [kapalı]


21

Programcılara İstisna İşleme konusunu öğretme konusunda nasıl gidiyorsunuz? Tüm diğer şeyler kolayca öğretilir - Veri Yapıları, ASP.NET, WinForms, WPF, WCF - siz onu isimlendirin, her şey kolayca öğretilebilir.

İstisna İşleme ile, onlara nihayet try-catch-öğretimi, İstisna İşleme'nın sadece sözdizimsel doğasıdır.

Bununla birlikte ne öğretilmelidir - Kodunuzun hangi bölümünü try bloğuna koyarsınız ? Tutma bloğunda ne yaparsın ?

Bir örnekle göstereyim.

Bir Windows Forms Project (küçük bir yardımcı program) üzerinde çalışıyorsunuz ve aşağıdaki gibi 3 farklı proje ile tasarladınız.

  1. UILayer
  2. BusinessLayer
  3. dataLayer

Bir İstisna (bir XDocument yüklemek için bir istisna atarsak söyleyelim) DataLayer'da (UILayer, DataLayer'ı çağıran BusinessLayer'ı çağırır) yükseltilirse, yalnızca aşağıdakileri yaparsınız:

//In DataLayer
try {
    XDocument xd_XmlDocument = XDocument.Load("systems.xml");
} 
catch(Exception ex)
{
    throw ex;
}

BusinessLayer'da hangisi tekrar atılır ve hangisi UILayer'da yakalanır?

İstisna İşleme konusunda böyle mi hareket ediyorsun?


15
Bunu yapacaksanız , yakalamak istemezsiniz (İstisna ex) {throw ex; } - bunun yerine sadece yakala {at; }
Steven Evers

4
Sonunda blokları unutmayalım mı?
Chris

1
Dili etiketlerde belirtmelisiniz. Çoğu istisna uygulamasında yaygın olandan daha fazla ayrıntıya giriyorsunuz ve blokların dışındaki şeyleri görmezden geliyorsunuz. Örneğin, C ++ 'da istisna işlemenin en önemli kısmı istisna güvenli programların nasıl yazılacağını bilmektir.
David Thornley


Umarım "İstisnalar" ı yakalamanın kötü bir fikir olduğunu biliyorsundur. Belirli istisnaları yakalamak ve bunları uygun şekilde ele almak için yuva blokları yerleştirmelisiniz (sadece istisnayı atmakla kalmaz).
eksiSeven

Yanıtlar:


29

İstisna işlemeyi açıklamak için, arkasındaki konsepti açıklayın: Bir hatanın sıklıkla oluştuğu kod, bu hatayı doğru bir şekilde nasıl idare edeceğini bilmiyor. Doğru şekilde nasıl kullanılacağını bilen kod, onu çağıran işlev olabilir veya çağrı yığını daha da yukarı olabilir.

İstisnaya neden olabilecek bir rutini çağıran bir rutin yazdığınızda, bu hatayı doğru şekilde nasıl kullanacağınızı biliyorsanız, aramayı bir try bloğuna koyun ve hata işleme kodunu catch bloğuna koyun. Değilse, yalnız bırakın ve çağrı yığında üstünüzdeki bir şeyin hatayı işlemesine izin verin.

"Eski yakala, eski fırlat" demek , istisnalarla baş etmek için iyi bir yol değildir , çünkü aslında hiçbir şeyle başa çıkmaz. Ayrıca, dilinizdeki istisna modelinin nasıl çalıştığına bağlı olarak, bu sorunu ayıklamak için kullanmış olabileceğiniz yığın izleme bilgilerini temizlediğinde zararlı olabilir. İstisna, çağrı yığınının nasıl işleneceğini bilen bir rutine ulaşana kadar yayılmasına izin verin.


4
"... aslında hiçbir şey işlemez çünkü", bu yüzden sık sık taşıma istisna yeni insanlarla taşıma aracı yakalamak düşünmek ve sorunu onarmak için bir şeyler yapmazsak fark etmez, bu kadar için 1 değil istisna işleme, Sadece kod şişirmek.
Jimmy Hoffa

13

Çoğu şey gibi, istisnalar ve istisnaların ele alınması muhtemelen, görünüşte daha basit olan çözümün (C tarzı dönüş kodları ve hata) neden bu kadar zayıf çalıştığını gösterene kadar yeni programcılar için bir problem arayışında bir çözüm gibi görünecektir. Sorunu motive ederek ve bağlam içine koyarak başlayacağım. Döndürme kodları veya genel / statik değişkenler kullanarak hata işlemenin nasıl yapılabileceğini gösterin. O zaman neden işe yaramadığını gösteren örnekler verin. O zaman ve ancak o zaman istisnalar ortaya çıkarın ve bunların bir bant dışı sinyal şeklinde olduklarını ve asıl mesele , bir istisna aldırmazsanız varsayılan davranışın çağrı yığınını üstesinden gelebilecek birine iletmektir. hallet.

Sonuç: C'de hata işlemenin nasıl yapıldığını göstermek, öğrencilerin istisnaların gerçekte ne için olduğunu anlamalarını ve gerçekten idare edemediğiniz istisnaları yakalamanın neden temelde Karanlık Çağlarda yapılması gerekenleri simüle ettiğini göstermektedir.


2
Onları geleneksel C tarzı geri dönüş kodlarında ve hata numaralarında liderlik etme ve kötü çalışıp çalışmadıklarını gösterme öğretimi için +1, bu yüzden onlara nasıl çalışacağını öğretmek harika bir şey!
Kanini

3
@Kanini: Genel olarak, göreceli olarak yeni / yüksek seviyeli yapıların, sorunların araştırılmasında çözüm gibi göründüğünü ve hangi sorunu çözmek istediklerini ve neden icat edildiklerini anlamadığınızda yanlış kullanımı kolay olduğunu düşünüyorum.
dsimcha

İstisnalar olmadan nasıl yapıldığını göstermenin iyi olduğuna katılıyorum, ancak sonra istisnaların ne zaman ve ne zaman başka tekniklerin kullanılacağının açıklanması zor geliyor (çünkü tüm durumlar istisnai değil)
Matthieu M.

@ Matthieu: Doğru. Ancak, tarihsel sorunların istisnalarının hangi boşlukta çözülmek zorunda olduğunu anlarsanız, bunları bir boşlukta öğrenmek yerine, bunları istisnai durumlar için kullanmanın aptalca olduğu daha açık bir hale gelir.
dsimcha

Tamam, bu yüzden + 1'imi aldın. Cevabınızın "asla başka bir mekanizma kullanma" olarak yorumlanabileceğini düşündüm :) :)
Matthieu M.

5

İstisnalar için Tasarım Kuralları ile başlayıp kısa ve DO, DO NOT ve AVOID'i içerirdim. Aynı zamanda nedenlerini de verir.

Örneğinizde, yeniden düzenleme bölümü Sarma İstisnaları olacaktır.

Ve bu şekilde yazılmasını beklerdim. Özel bir istisna yakaladığını ve daha anlamlı bir mesajın yayılması için bilgi eklemeye çalıştığını unutmayın. Ayrıca, iç istisnanın hala kayıt amacıyla tutulduğunu unutmayın.

//In DataLayer

try
{
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
}
catch(FileNotFoundException ex)
{
        throw new TransactionFileMissingException(
                     "Cannot Access System Information",ex);
}

GÜNCELLEME Kanini, bu istisna bloğunun Veri Katmanında bulunmasının doğru olup olmadığını veya dosyanın kontrolünün İş Katmanı'na uygun olup olmadığını soruyor.

Öncelikle, Sarma İstisnaları gerekçesinin bu olduğunu belirtmek isterim.

Alt katman istisnası, yüksek katman operasyonu bağlamında bir anlam ifade etmiyorsa, alt katmandan atılan özel istisnaları daha uygun bir istisnada sarmayı düşünün.

Eğer daha yüksek bir katmana sahip olduğunu düşünüyorsanız, dosya hakkında bir şey bilmeli, o zaman veri katmanınız şöyle görünmelidir.

//In DataLayer

XDocument xd_XmlDocument = XDocument.Load("systems.xml");

Hayır, yakala.

Şahsen, veri katmanınız bir montaj kaynağı olan default systems.xml kullanmak gibi yararlı bir şey yapamadığı sürece hiçbir şey yapmadan veya istisnayı sarmamanın, günlüğe kaydetmenizin size hangi yöntemi ve sorunun ne olduğunu söyleyeceği için iyi bir bahis olduğunu düşünüyorum. ( throw exBu durumda veya tercih edilen throwde öyle ama değer katmıyor). Bu, bir kez tanımlandıktan sonra sorunu hızla çözebileceğiniz anlamına gelir.

Aslına bakılırsa, bu özel örnek ayrıca, XDocument.Load'un dört yürütme işlemi yapabilmesi için aşağıdaki sorunlara da sahiptir:

  • ArgumentNullException
  • SecurityException
  • FileNotFoundException
  • UriFormatException

Aşağıdaki kodun ve FileNotFoundException dosyalarının atılmayacağını garanti edemeyiz, çünkü sadece varoluş kontrolü yaptığımızda ve yükleme yaparken gittiğimizde de olabilir. Bunun iş katmanına uygun olması yardımcı olmaz.

 if (File.Exists("systems.xml")) 
     XDocument.Load("systems.xml");

SecurityException daha da kötü, çünkü bunun için atılan diğer nedenlerin yanı sıra, başka bir işlem tutucusu özel bir dosya kilidine sahipse, File.CanIOpenThis () yöntemi olmadığı için okumak için açmayı deneyene kadar hatayı almayacaksınız. Eğer böyle bir yöntem mevcutsa, hala File.Exists ile aynı problemi yaşarsınız.


Fix: Teşekkürler! Ancak bu istisna bloğunu Veri Katmanında kullanmak doğru mudur? Dosyanın İş Katmanında Olup Olmadığını Kontrol Etmek Gerekiyor mu? Aksi halde, kodu yazma yönteminizi kabul ediyorum.
Kanini

Düzeltme: Ana dilimde Kanini bir Bilgisayar, Kani ise bir meyve anlamına gelir ;-)
Kanini

Benim hatamdan dolayı çok üzgün olmadığınızı söyleyebilirim ama çok üzgünüm ve düzelttim.
Conrad Frix

1
Fix: Üzgün? Bir şey değil. Büyük ölçüde eğlendirdi. Ağabeyim, bunu ona gösterdiğimden beri gülmeyi bırakmadı çünkü öncelikle, garip şekil dışında hiçbir meyveye benzemiyorum ...
Kanini

4

Rol yapalım. (bu şaka yazısı değil)

Çağrı zincirini uyguladığınız bir atölye yapmalısınız. Her insan bir nesnedir. Yeni başlayanlara ve "oyunu" anlayan bazı insanlara ihtiyacınız olacak.

Dosya IO gibi gerçekten basit bir konu kullanın. gui-> modeli-> file_io

Dosya okuyucusu olan kişinin bir sonrakini anlatması gerekir ....

İlk önce dönüş kodları ile yapın. (post-it notları kullanın?)

Eğer etkileşimler sadece “kodun söylediği şey” ise, çok yakında insanlara istisnaların istisnai olduğunu anlamalarını sağlayabilirsiniz.

dönüş kodları için, bir notu iletin.

istisnalar için ellerini havaya kaldır ve sorunun ne olduğunu söyle.

o zaman onları "x yakala, x at" yap ve tanıyı çok daha kötü hale getir. GUI'nin "modelin bir istisnası vardı" dediği şey.

Bence bu, sahip olduğunuz insanları eğitmek için işe yarayacak, çünkü insanlar diğer insanlarla olan etkileşimleri çok iyi anlıyor.


Rol yapma fikri için +1. Bunu daha önce hiç düşünmemiştik. Kim programlama öğretiminin Role Play ile yapılabileceğini düşünmüş olabilir?
Kanini,

1

Örneğin, sınıfların çocuk / ebeveyn ilişkisini anlamanız gereken ilk istisnaları anladığınızı hayal ediyorum. Çocuğun işlevselliği bir ebeveynden devralabildiğini anlarsanız, ilköğretim düzeyinde bir çocuğun bir sorunu varsa üstesinden gelemeyeceğini ve bu sorunu (istisna) ebeveyne ileteceğini ve ebeveynin anlaşma yapabileceğini anlayabilir. Bununla.

Bu, bir istisnayı nasıl idare edeceğini bilen bir yer bulana kadar zincirlenmiş bir ilişki haline gelir.

Ve nihayet gittiği kadarıyla önemsiz olan kısım ... bir problem ortaya çıktığında, bir problemle başa çıkmak zorunda kaldığı için programın ölümcül şekilde çıkmaması, bu istisna ele alındıktan sonra, nihayet blok, her zaman deneme yakalamadan bağımsız olarak yürütülecek olan oradadır. .

Buna iyi bir örnek, ağ oluşturmada olabilir:

  • bağlantı kurarız
  • bağlantı tamam, onu kullanıyoruz
  • bittiğinde yakınlaşır ve kaynakları serbest bırakırız

veya istisnai durumlarda:

  • Bağlantı Kur
  • bir şeyin işlediği bir istisna ortaya çıkar
  • hangi noktada bağlantı ve kaynakları serbest bırakıyoruz

1

Çok iyi bir istisna olan acemiye bir başvuru yapın. Bir yere bazı istisnalar atın ve Logs yardımı ile hata ayıklamalarını sağlayın. İstisna bildiriminin izini sürerek hata ayıklayabilmeliler. Bu egzersizi 3 ya da 4 kez yapın. Şimdi tüm İstisna işlemlerini koddan kaldırın ve aynı istisnayı izlemeye çalışmalarına izin verin.

İstisna İşleme kodunun takdirinin anında takdir edileceğine inanıyorum.


Bir plana benziyor. İnternette tavsiye edebileceğiniz örnek bir kodunuz var mı (örneğin, sourceforge.net).
Kanini

0

IMO, istisna yönetimi ve akış kontrolü ifadelerinin temelde aynı olduğunu düşünmelisiniz. Bunları, programlarınızın akışını, şu anda hangi koşulda olduklarına göre kontrol etmek için kullanırsınız.


@denny: "Bir istisna işleme yalnızca bir hata (veya istisna) oluştuğunda tepki verir" ile aynı fikirdeyim, ancak "istisna işleme ve akış kontrolü ifadelerinin temelde aynı olduğu" ifadesinden tam olarak emin değilim. Saygılarımla orada aynı fikirde değilim. Yakalama bloğu kuşkusuz bu şart altında ne yapması gerektiğini yapar. Bununla birlikte, try bloğu akış veya kontrol ile ilgili değildir. Nihayet blok, yine de akış veya kontrol ile ilgili değildir. Belki de cevabınızı yanlış anladım, ama ben ve başkalarının yararına açıklık getirir misiniz?
Kanini

0

Muhtemelen yeni bir programcıya yardımcı olmazdı, ancak fonksiyonel programlamada monad kullanmaya başladığımda istisnalar kavramını çok daha iyi anladığımı gördüm. Bir monad, verilerin bir programa girip çıkabileceği her "kanalı" düşünmeye zorlar, çünkü her şey o veri akışının bir kısmını "gizlemek" için uygun bir soyutlama sağlar.

Bir işlevin farklı çıktı türlerine sahip olabileceği fikri ve bir istisna, işlevden daha yüksek öncelikli bir geri dönüş türü gibidir.

Dikkat edin, istisnaların çoğu dilde (uygulama detayları) çalışmadığını anlıyorum, ama soyut anlamda, olan budur.


0

Bir maymun gibi davranarak klavyeyi kullanıyor

Adamlarıma bir maymunun keyborad'da oturuyor olacaklarını söyleyerek kod yazarken ve bu uygulamayı kullandıklarını söylerdim.

Bu, onlara her türlü şeyi nasıl tahmin edeceklerini öğretti:

  • Kayıp veri
  • Kayıp dosyalar
  • Sayı beklerken alfa karakterleri
  • Sıfıra bölüm

Bence sadece bir maymunun sadece anahtarlara çarpması ve hile yapmak yerine güzel bir şekilde takip etmek yerine ne gerekiyorsa yapmasıydı. Benim için çalıştı.


Maymunlar? Sanırım, işletme kullanıcılarınız hiç
duymadılar

@Kanini - İyi biri. Deniz Piyadeleri günlerimdeydi. Sadece hata yakalama söz konusu olduğunda adamlarım kutunun dışında düşünmek istedim. Sadece hata ayıklama mı dedim ... İstisna işleme demek istedim.
Michael Riley - AKA Gunny
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.