SORU
19 EYLÜL 2008, Cuma


Özel Durumlar veya Dönüş kodları tercih edersiniz?neden olan ve

Benim sorum en geliştiriciler, hata işleme, özel Durumlar için tercih ne olduğunu ya da Hata Kodlarını Döndürür. Dil(veya dil ailesi) diğer üzerinden bir tercih neden özel ve lütfen.

Meraktan soruyorum bunu. Şahsen daha az patlayıcı olduğundan Hata Dönüş Kodları tercih ederim ve eğer istemiyorsan eğer ... kullanıcı kodu özel durum performans cezası ödemeye gücü yok.

güncelleme: tüm cevaplar için teşekkürler! İstisnalar dışında kod akışı belirsizliğin, sevmediğim, ancak söylemeliyim. Dönüş kodu (ve ağabeyleri kolları) hakkında yanıt kodu için Gürültü ekleyin.

CEVAP
21 EYLÜL 2008, Pazar


Bazı dillerde (örneğin C ) Kaynak sızıntıya neden olmamalıdır

C DEMİRYOLU dayanmaktadır.

Eğer başarısız, iade veya atmak (normal kodu) diye bir kod varsa, o zaman akıllı bir işaretçi (varsayarak bir var . içinde işaretçiyi sarılmış olmalıdır ^em>çok iyinesne yığın oluşturmuş değil nedeni).

Dönüş kodları daha ayrıntılı

Ayrıntılı ve bir şey gibi görülür:

if(doSomething())
{
   if(doSomethingElse())
   {
      if(doSomethingElseAgain())
      {
          // etc.
      }
      else
      {
         // react to failure of doSomethingElseAgain
      }
   }
   else
   {
      // react to failure of doSomethingElse
   }
}
else
{
   // react to failure of doSomething
}

Sonunda, kod idented talimatları (üretim kodu kodu bu tür gördüm) topluluğudur.

Bu kod da çevrilmiş olabilir:

try
{
   doSomething() ;
   doSomethingElse() ;
   doSomethingElseAgain() ;
}
catch(const SomethingException & e)
{
   // react to failure of doSomething
}
catch(const SomethingElseException & e)
{
   // react to failure of doSomethingElse
}
catch(const SomethingElseAgainException & e)
{
   // react to failure of doSomethingElseAgain
}

Temiz Kodu ve hata işleme, ayrı olanolabilirbiriyişey.

Dönüş kodları daha kırılgan

Eğer bir derleyici bilinmedik bir uyarı ("" 's comment), kolayca göz ardı edilebilir. phjr bakın

Yukarıdaki örnekler ile, birisi Olası hata (bu durumda...) ele unutur daha varsayalım. Hata göz ardı edilir "iade" belki daha sonra patlayabilir, ve (NULL işaretçi gibi). Aynı sorun dışında bir şey olmayacak.

Hata göz ardı edemeyecek. Bazen patlamak istiyorsun, ama... gerekir Çok dikkatli seçti.

Dönüş Kodları bazen çevrilmesi gerekir

Hadi aşağıdaki işlevleri var ki:

  • bir int dönebilirsiniz olan şey, NOT_FOUND_ERROR aradı
  • bir bool dönebilirsiniz doSomethingElse, "" (başarısız) . yanlış
  • bir Hata nesnesi (her ikisi de __SATIR_, _____ buçuk yığın değişkenleri DOSYA. dönebilirsiniz doSomethingElseSagain,
  • hangi doTryToDoSomethingWithAllThisMess, iyi... yukarıdaki fonksiyonları Kullanmak ve türde bir hata kodu döndürür...

Eğer denilen işlevlerinden biri başarısız olursa doTryToDoSomethingWithAllThisMess dönüş türü nedir ?

Dönüş Kodları evrensel bir çözüm değildir

Operatörler hata kodu döndüremez. C olamaz, çok yapıcılar.

Dönüş Kodları ifadeler zinciri anlamına gelir

Yukarıdaki noktanın sonucu. Eğer yazmak istersem ne olacak:

CMyType o = add(a, multiply(b, c)) ;

Ben dönüş değeri zaten kullanıldığı için değil, (ve bazen, değiştirilemez). Böylece dönüş değeri ilk parametre, bir referans olarak gönderilen... Ya da yok olur.

İstisna girilir

Durum her tür için farklı sınıflar gönderebilirsiniz. Ressources istisnalar (yani bellek) ışık olmalı, ama başka bir şey gerekli olduğu kadar ağır (Java Hariç, bana tüm vermek yığını gibi) olabilir.

Her yakalamak sonra da özel olabilir.

Yeniden atma olmadan . hiç yakalamak kullanmayın(...)

Genellikle, bir hata gizlemek gerekir. Eğer bunu yaparsanız yeniden atmak, en azından bir dosyada hata günlüğü, bir messagebox açık, ne olursa olsun...

Özel durum... NUKE

Dışında sorun onları fazla kullanmak kod dene/yakalar dolu üretecek. Onun/yakalamak/deneyin onun kodu STL kapsayıcı kullanan Kim? ama sorun başka bir yerde: Yine de, bu konteynırları bir istisna gönderebilirsiniz.

C elbette , hiç bir özel durum çıkış yıkıcı izin vermeyin.

Özel durum... senkron

Dışarıda diz veya yaymak Windows ileti döngüsü içinde onun üzerinde konu açmadan önce onları yakalamak için emin olun.

Çözüm onları karıştırma olabilir mi?

Çözümü gereken bir şey atmak için sanırımdeğilolur. Ve bir sey olabilir, o zaman bir dönüş kodu veya bir parametre, bir kullanıcı için tepki etkinleştirmek için kullanın.

Yani, tek soru "olmamalı şey nedir?"

Fonksiyon sözleşmesine bağlı. Eğer işlevi kabul eden bir işaretçi, ama belirtir gösterici olmalı, BOŞ olmayan, sonra da ok atmak için bir istisna kullanıcı gönderir bir NULL işaretçi (soru, C , zaman yoktu işlevi yazar referanslar kullanmak yerine işaretçileri, ama...)

Başka bir çözüm hatayı göstermek için olacak

Bazen, sorun, hata istemiyorum. Özel durumlar veya hata dönüş kodları kullanarak çok iyi ama... bunu bilmek istiyorum.

İşim gereği, bir tür kullanıyoruz"". İddia Bir yapılandırma dosyası değerlere bağlı olarak, hata ayıklama derleme seçenekleri serbest/önemi yok

  • hata günlüğü
  • bir messagebox ile bir açık "Hey, bir sorunumuz var"
  • bir messagebox ile bir açık "Hey, bir sorun var, hata ayıklamak istiyor musunuz"

Hem de geliştirme ve test, bu tespit, ve sonra bazı kod catch içinde dönüş değeri hakkında, ya da umurunda zaman değil tam olarak sorunu kesin olarak belirlemek için Kullanıcı etkinleştirin.

Kolay eski kod eklemek. Örneğin:

void doSomething(CMyObject * p, int iRandomData)
{
   // etc.
}

neden kod bir tür benzer:

void doSomething(CMyObject * p, int iRandomData)
{
   if(iRandomData < 32)
   {
      MY_RAISE_ERROR("Hey, iRandomData " << iRandomData << " is lesser than 32. Aborting processing") ;
      return ;
   }

   if(p == NULL)
   {
      MY_RAISE_ERROR("Hey, p is NULL !\niRandomData is equal to " << iRandomData << ". Will throw.") ;
      throw std::some_exception() ;
   }

   if(! p.is Ok())
   {
      MY_RAISE_ERROR("Hey, p is NOT Ok!\np is equal to " << p->toString() << ". Will try to continue anyway") ;
   }

   // etc.
}

(Yalnızca hata ayıklama etkin olan benzer makrolar var).

Üretim, dosya istemci hiçbir zaman bu makro sonucu görür yok... Ama bu kadar kolay yapılandırma gerektiğinde etkinleştirmek unutmayın.

Sonuç

Size dönüş kodları kullanarak kodu, başarısızlık için kendinizi hazırlamak ve testleri kalen yeterince güvenli olduğunu umuyoruz.

Sana özel bir kod kullanarak, kodunuzu başarısız olabilir, ve genellikle kodunda seçilmiş stratejik konumu counterfire yakalamak koy, biliyorsun. Ama genellikle, kodunuzu daha fazla yapmalısın "" sonra "korkarım ne olacak".

Ama sen, senin emrinde en iyi aracı kullanmanız gerekir, ve kod bazen zaman, "Asla bir hata gizlemek ve en kısa sürede göstereceğim". Yukarıda bahsettiğim makro bu felsefe izleyin.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ludique

    Ludique

    21 NİSAN 2009
  • Theodore Leaf

    Theodore Lea

    29 AĞUSTOS 2006
  • ThreadBanger

    ThreadBanger

    2 Mart 2007