SORU
22 NİSAN 2013, PAZARTESİ


İyi bir uygulama-dışında-başka deneyin Python kullanabilir miyim?

Python ile zaman zaman blok görüyorum

try:
   try_this(whatever)
except SomeException as exception:
   #Handle exception
else:
   return something

Eğer bunun dışında başka bir deneyin var nedir?

Eğer cehalet ise bilmiyorum, ama istisnalar akış kontrolü gerçekleştirmek için kullanıyor gibi programlama bu tür sevmiyorum. Eğer dili dahil ise, kendisi için iyi bir nedeni olmalı, değil mi?

İstisnalar değil anladığım kadarıylave bu yüzden sadece kullanılmak için olağanüstü koşullar (örneğin ben denemek için yazmak bir dosya içine disk ve orada hiçbir daha fazla yer, ya da belki ben izin), ve akış kontrolü.

Normalde Özel İdare ettim:

something = some_default_value
try:
    something = try_this(whatever)
except SomeException as exception:
    #Handle exception
finally:
    return something

Ya Eğer gerçekten hiçbir şey geri dönmek istiyorsanız eğer özel bir durum olursa, o zaman:

try:
    something = try_this(whatever)
    return something
except SomeException as exception:
    #Handle exception

Bir şey mi kaçırdım?

CEVAP
22 NİSAN 2013, PAZARTESİ


"Eğer cehalet ise bilmiyorum, ama artık böyle şeyler yapmıyorum istisnalar akış kontrolü gerçekleştirmek için kullanıyor gibi programlama gibi."

Python dünyada, akış kontrolü için özel durumlar kullanarak yaygın ve normaldir.

Hatta Python çekirdek geliştiricileri akış kontrolü için özel durumlar kullanmak ve stil dili (protokol StopIteration döngü sonlandırma sinyali kullanır yineleyici yani) ağır pişirilir.

Buna ek olarak,-dışında-stili deneyin "look-before-you-leap" yapıları bazı yarış koşulları doğal önlemek için kullanılır. Zaman örneğin, out-of-tarih olabilecek bilgiler os.path.exists test sonuçları kullanın. Aynı şekilde, Queue.full eski olabilir bilgi verir. try-except-else style bu gibi durumlarda daha güvenilir bir kod üretecek.

"İstisna değil, benim anladığım, onlar sadece hataları olağanüstü koşullar için kullanılabilir"

Diğer bazı dillerde, bu kural arşivlerine yansıyan kültürel normları yansıtır. "Kural" da temel alan-bir kısmı bu dillerde performans değerlendirmeleri.

Python kültürel norm biraz farklı. Birçok durumda, sengerekirkontrol Akış için istisnalar kullanın. Ayrıca, özel durumlar Python değil yavaş çevredeki Kodu ve telefon kodu gibi bazı derlenen diller (yani CPython zaten uygular kodu özel durum denetlemesi her adım, ne olursa olsun ister aslında istisnalar ya da değil).

Diğer bir deyişle, "özel durumlar müstesna için" Python için bazı diğer dillerde, ama değil. mantıklı bir kural olduğunu anlayışınız

Eğer dilin kendisi dahil ise "ancak, bir olmalı bunun için iyi bir neden, değil mi?"

Yarış durumları önlemek için yardımcı olmanın yanında, özel durumlar da hata işleme dışında döngüler çekmek için çok yararlıdır. Bu otomatik loop invariant code motion sahip olma eğilimi olan yorumlanmış dil gerekli bir optimizasyon.

Ayrıca, istisna bir sorunu işlemek için yeteneği çok sorun ortaya çıktı yerden çıkarılır yaygın durumda kodu biraz kolaylaştırabilir. Örneğin, ortak sırayla düşük düzey rutinleri çağıran üst düzey kullanıcı arayüzü kodu iş mantığı için kod arıyorum. Durumlar nedeniyle oluşan düşük seviyeli rutinleri (örneğin, yinelenen kayıtları için benzersiz anahtarlar veritabanı erişir) sadece işlenmiş en üst düzey kod (gibi soran kullanıcı için yeni bir anahtar değil çatışma ile varolan anahtarları). Kontrol akış bu tür istisnalar kullanımı orta düzey rutinleri tamamen sorunu görmezden ve akış-kontrol o açıdan güzel ayrılmış olmasını sağlar.

nice blog post on the indispensibility of exceptions here.

Ayrıca, bu StackOverFlow cevap bakın: Are exceptions really for exceptional errors?

"Bunun dışında başka bir deneyin yok?"

Başka bir fıkra kendisi ilginç. Ama önce bir istisna nihayet tümcesi olduğunda çalışır. Bu onun birincil amacı.

Başka bir madde olmadan, sonuçlandırılması önce ek kod çalıştırmak için tek seçenek deneyin maddesi için kod ekleme sakar bir antrenman olacak. Bu riskleri nedeniyle sakar tarafından korunmaya yönelik değildi kodu yükselterek özel durumlar-blok deneyin.

Sonuçlandırılması önce ek korumasız çalışan kod kullanımı-durum çok sık meydana gelmez. Yayınlanan kod içinde pek çok örnek görmek için beklemeyin. Biraz nadirdir.

Bir başka fıkra ise bir istisna oluştuğunda oluşan eylemleri gerçekleştirmek için kullanma durumu ve özel durumlar ele alınır gerçekleşmez. Örneğin:

   recip = float('Inf')
   try:
       recip = 1 / f(x)
   except ZeroDivisionError:
       logging.info('Infinite result')
   else:
       logging.info('Finite result')

Son olarak, bir deneyin blok içinde başka bir fıkra en yaygın kullanımı güzelleştirme biraz (girinti aynı düzeyde olağanüstü sonuçlar ve olmayan olağanüstü sonuçlar hizalama). Bu kullanım her zaman isteğe bağlıdır ve kesinlikle gerekli değil.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DJAndrewRyan

    DJAndrewRyan

    22 Ocak 2007
  • engineerguy

    engineerguy

    10 Ocak 2010
  • njhaley

    njhaley

    24 NİSAN 2006