Kitabın ana argümanı, kodun istisna sürümünün daha iyi olduğudur; çünkü kendi hata kontrolünüzü yazmaya çalıştıysanız, göz ardı edebileceğiniz herhangi bir şeyi yakalayacaktır.
Bence bu ifade sadece çok özel durumlarda doğrudur - çıktıların doğru olup olmadığına aldırmıyorsanız.
Hiç şüphesiz istisnaları yükseltmenin sağlıklı ve güvenli bir uygulamadır. Bunu, programın şu anki durumunda (geliştirici olarak) başa çıkamayacağınız veya uğraşmak istemediğiniz bir şey olduğunu hissettiğinizde yapmanız gerekir.
Bununla birlikte, örneğin, istisnalar yakalamakla ilgilidir . Bir istisna yakalamak, konum değil gözden kaçırdığınız bir senaryoları kendinizi korumak. Tam tersini yapıyorsunuz: bu tür istisnalara neden olabilecek herhangi bir senaryoyu gözden kaçırmadığınızı varsayıyorsunuz ve bu nedenle onu yakalamanın doğru olduğundan emin olduğunuzdan (ve böylece programın çıkmasına neden olmasını engellediğinizden, yakalanmayan istisnalar gibi).
İstisna yaklaşımını kullanarak, istisna görürseniz ValueError
, bir satırı atlarsınız. Geleneksel istisna dışı yaklaşımını kullanarak, döndürülen değerlerin sayısını sayarsınız split
ve 2'den küçükse bir satır atlarsınız. İstisna yaklaşımı konusunda kendinizi daha güvende hissetmelisiniz, çünkü geleneksel hata kontrolünüzdeki bazı diğer "hata" durumlarını unutmuş olabilirsiniz ve except ValueError
onları sizin için yakalar mı?
Bu, programınızın doğasına bağlıdır.
Örneğin, bir web tarayıcısı veya video oynatıcısı yazıyorsanız, girişlerle ilgili bir sorun, yakalanmamış bir istisna ile kilitlenmesine neden olmamalıdır. Uzaktan mantıklı bir şey çıkarıp bırakmaktan çok daha iyidir (kesinlikle, kesinlikle yanlış konuşsa bile).
Doğruluğun önemli olduğu bir uygulama yazıyorsanız (iş veya mühendislik yazılımı gibi), bu korkunç bir yaklaşım olacaktır. Yükselen bazı senaryoları unutursanız ValueError
, yapabileceğiniz en kötü şey, bu bilinmeyen senaryoyu sessizce görmezden gelmek ve sadece çizgiyi atlamaktır. Bu, yazılımda çok ince ve pahalı böceklerin ortaya çıkmasıdır.
ValueError
Bu kodda görmenin tek yolunun split
sadece bir değer (iki yerine) döndürülmesi olduğunu düşünebilirsiniz . Ancak print
, ifadeniz daha sonra ValueError
bazı koşullar altında yükselten bir ifade kullanmaya başlarsa ne olur ? Bu, bazı satırları atlamanıza neden olur, :
çünkü özledikleri için değil , print
başarısız oldukları için. Bu daha önce bahsettiğim ince bir hata örneği - hiçbir şey farketmezsiniz, sadece bazı satırları kaybedersiniz.
Benim tavsiyem, hatalı çıktı üretmenin çıkıştan daha kötü olduğu koddaki istisnaları yakalamaktan (ancak yükseltme yapmamaktan) kaçınmaktır. Böyle bir kodda bir istisna yakalayabildiğim tek zaman, gerçekten önemsiz bir ifadeye sahip olduğum zamandır, bu nedenle olası istisna türlerinin her birine neyin sebep olabileceğine kolayca sebep olabilirim.
İstisnalar kullanılmasının performansa etkisi ile ilgili olarak, istisnalar sıkça karşılaşılmadıkça önemsizdir (Python'da).
Rutin olarak ortaya çıkan koşulları işlemek için istisnalar kullanırsanız, bazı durumlarda çok büyük bir performans maliyeti ödeyebilirsiniz. Örneğin, uzaktan bir komut çalıştırdığınızı varsayalım. Komut metninizin en azından minimum doğrulamayı geçtiğini kontrol edebilirsiniz (örneğin, sözdizimi). Veya bir istisnanın ortaya çıkmasını bekleyebilirsiniz (yalnızca uzaktaki sunucu komutunuzu ayrıştırdıktan ve bununla ilgili bir sorun bulduktan sonra gerçekleşir). Açıkçası, eski büyüklük emirleri daha hızlıdır. Başka bir basit örnek: Bir sayıyı bölmeyi çalıştırmaya çalışmaktan ve ZeroDivisionError istisnasını yakalamaktan sıfır ~ 10 kat daha hızlı olup olmadığını kontrol edebilirsiniz.
Bu hususlar yalnızca uzak sunuculara sıklıkla hatalı biçimlendirilmiş komut dizeleri gönderirseniz veya bölme için kullandığınız sıfır değerli değişkenleri alırsanız önemlidir.
Not: Sadece except ValueError
bunun yerine kullanacağınızı varsayıyorum except
; Diğerlerinin dediği gibi, kitabın da birkaç sayfada söylediği gibi, asla çıplak kullanmamanız gerekir except
.
Başka bir not: Özel istisna dışı yaklaşım, split
aramak yerine geri döndürülen değerlerin sayılmasıdır :
. İkincisi çok yavaş, çünkü yaptığı işi tekrarlıyor split
ve uygulama süresini neredeyse iki katına çıkarabiliyor.