Hata kontrol ve kullanımımı nasıl geliştirebilirim?


13

Son zamanlarda doğru miktarda kontrolün ne olduğunu ve uygun yöntemlerin ne olduğunu anlamak için uğraşıyorum.

Bununla ilgili birkaç sorum var:

Hataları kontrol etmenin uygun yolu nedir (hatalı girdi, hatalı durumlar, vb)? Hataları açıkça kontrol etmek veya son kodunuzdan optimize edilebilen bildirimler gibi işlevleri kullanmak daha mı iyi? Ben açıkça nihayet çoğu durumda yürütülmemesi gereken ekstra kod bir sürü bir program clutters kontrol gibi hissediyorum ve çoğu hata bir iptal / çıkış hatası ile sona erdi bahsetmiyorum. Neden bir işlevi sadece iptal etmek için açık denetimlerle karıştırmak gerekir? Ben hatalar açık kontrol karşı iddialar aradım ve ne zaman ya da ne zaman gerçekten açıklamak için çok az buldum.

Çoğu, 'mantık hatalarını kontrol etmek için ekleri kullan ve diğer hataları kontrol etmek için açık kontrolleri kullan' diyor. Bu bizi çok fazla etkilemiyor gibi görünmüyor. Bunun mümkün olduğunu söyleyebilir miyiz:

Malloc returning null, check explictly
API user inserting odd input for functions, use asserts

Bu beni hata kontrolünde daha iyi yapar mı? Başka ne yapabilirim? Gerçekten daha iyi 'profesyonel' kod geliştirmek ve yazmak istiyorum.


3
Güzel soru, ama kardeş sitelerden biri için daha uygun olabileceğini düşünüyorum (programcılar?).

Teşekkürler, emin değildim. Ben kod ile ilgili oldukça SO beri iyi olacağını düşündüm.
Anon

3
Basit cevap şudur: "Bu nedenle istisnalar icat edildi. Daha iyi bir dil edinin."
DeadMG

1
@DeadMG: setjmp/ longjmp, C dilinde mevcuttur, bu nedenle yeni bir dile ihtiyacınız yoktur.
user786653

3
@DeadMG: C hata kontrolünü doğru alamayan birisinin cehennemde kartopu şansı var C ++ istisna işleme doğru alma ...
Coder

Yanıtlar:


4

Farkı söylememin en kolay yolu, hata durumunun derleme zamanında mı çalışma zamanında mı başlatılacağını belirlemektir. Sorun bir şekilde yanlış kullanan bir programcıysa, soruna dikkat çekmek için bir iddia yapın, ancak düzeltme çağrı koduna derlendikten sonra, artık kontrol etme konusunda endişelenmenize gerek yoktur. Belleğin bitmesi veya kötü son kullanıcı girdisi gibi sorunlar derleme zamanında çözülemez, bu nedenle kontrolleri bırakırsınız.


2

% 100 altında herhangi bir zamanda (bu son kontrolünden sonra değişmiş olabilir) bulunan onay şeyler yapın sizin komuta. Ve ayrıca: Geliştirme sırasında bile kendine güvenme! ;-)

Okokok ... "şey" bir neden olacak bu tür şeyleri kontrol olarak okunacak içindir anormal application / sistem yapabilir iptaline ya da bir şey onu gerektiği şeyler değil yapmak.

Ciddi olmak için, son cümlenin son kısmı önemlidir çünkü ana konuyu işaret eder:

Eğer istikrarlı bir sistemi değil sistem ne yapması gerektiğini en önemli çekince o inşa etmek, ama buna gereken özen, bir ihtiyacı böyle zorunlu şeyler yapabilmek izin vermek istiyorsanız değil , bunu bile "clutters senin kod".


1
'Her şeyi kontrol et' için +1. Kod karmaşası argümanını satın almıyorum: herhangi bir programcı yine de hata denetimi ve gerçek mantık arasındaki farkı ayırt edebilmelidir.
stijn

2

Hata işlemenin temel noktası, sorunu yakalayıp yakalamadığınız ve nasıl yakaladığınız değildir. Bunu öğrendikten sonra yaptığınız şeyden daha fazlası .

İlk uzakta - Ise, diyelim ki bağımlı yöntem tarafından döndürülen herhangi bir tek hata döndürme hiçbir neden ele alınmamalıdır. Hatalar ve istisnalar döndürülen değerlerden veya tüm try / catch değerlerinden daha fazladır.

  1. Sadece fırlatmak ve yakalamak yeterli değil.
    Şuna bakın : yazarın sadece yakalayarak ancak hiçbir şey yapmadan istisnayı baskılayabileceğini ve hasarı geri almak için yeterli yapılmadıkça - kodun böyle gitmesine izin vermekten daha kötü olduğunu açıklayın. Benzer şekilde, bir dosya açık veya okuma hatası olduğunda sadece "log" deyimi yazmak bunun nedenini bulmanıza yardımcı olabilir - ancak program sona erdiğinde verilerin zarar görmesine neden olmuş olabilir! Birçok deneme / yakalama olduğunu söylemek yeterli değildir - gerçekten ne yaptıklarını bilmek daha önemlidir!

  2. Denemek ve yakalamak kötüye kullanmayın.
    Bazı zamanlarda - çoğunlukla tembel veya naif programcılar, yeterli deneme / yakalama yazdıktan sonra işlerinin bittiğini ve kolay olduğunu düşünürler. Çoğu zaman, her şeyi dökmek yerine düzeltici eylem uygulamak ve devam ettirmek en iyisidir. Bu yapılamazsa, hangi seviyeye geri dönmeniz gerektiğine karar verilmesi gerekir. Bağlama ve ciddiyete bağlı olarak, dikkatli bir tasarıma ihtiyaç duyan yuvalama yapmayı deneyin. Örnek- için bu bakın ve bu

  3. Kimin sorumlu olduğunu tanımlayın:
    Yapmanız gereken ilk şey, rutinin kendisine verilen girdinin sadece kabul edilemez (veya şu ana kadar ele alınmamış) bir senaryo mu yoksa çevre (sistem sorunu, bellek sorunu gibi) istisna olup olmadığını tanımlamaktır. bu durum algoritma sonucundan kaynaklanan tamamen içsel bir durumdur. Her durumda - geri dönmek isteyebileceğiniz düzey veya yapmak istediğiniz işlem önemli ölçüde farklılık gösterir. Bu ışıkta söylemek istiyorum ki - üretimde kodu çalıştırdığınızda - programdan çıkmak için abort () yapmak iyidir - ama her küçük şey için değil. Bellek bozulmasını veya bellek yetersizliğini tespit ederseniz, elinizden gelenin en iyisini yaptıktan sonra bile - işlerin öleceği kesin. Ancak girişte bir NULL işaretçisi alırsanız -

  4. Mümkün olan en iyi sonucun ne olduğunu tanımlayın:
    İstisna altında her şeyin yapılması çok kritiktir. Örneğin, vakalarımızdan birinde - bir medya oynatıcı, kullanıcıya çalınacak tam verilere sahip olmadığını bulursa - ne yapmalı?

    • Ya bazı kötü kısımları atla ve iyi şeylerle baş edip edemeyeceğini gör.
    • bu çok fazla olursa bir sonraki şarkıya atlayıp atlayamayacağını düşünün.
    • herhangi bir dosyayı okuyamayacağını fark ederse durun ve bir şey gösterin.
    • bu arada
    • hangi oyuncuya hangi oyuncunun kullanıcıya POP-UP eklemesi gerektiğini ve
    • ne zaman kendi başına taşınmalı?
    • Kullanıcılardan geri bildirim istemek için "dur "sa
    • ya da bir köşeye dikkat çekmeyen küçük bir hata notu koymalı mı?

    Bütün bunlar özneldir - ve belki de sorunla başa çıkmak için önemsiz şeylerden daha fazla yol vardır. Yukarıdakilerin tümü, istisnanın derinliğini oluşturmayı ve anlamayı gerektirir ve ayrıca farklı senaryolar geliştirmenin de mümkün olması gerekir.

  5. Bazen istisnaları ortaya çıkmadan kontrol etmeliyiz. En yaygın örnek, sıfır hataya bölmedir. İdeal olarak, böyle bir istisna atılmadan önce test edilmelidir - ve eğer durum buysa - en uygun sıfır olmayan değeri koymaya çalışın ve intihar etmek yerine devam edin!

  6. Temizlemek. En azından yapmanız gereken bu! Bir işlev 3 dosyayı açarsa ve dördüncüsü açılamazsa - ilk 3'ün kapatılması gerektiğini söylemeye gerek yoktur. Bu işi yukarıdaki katmana devretmek kötü bir fikirdir. hafızayı temizlemeden ayrılmaya karar verirseniz. Ve en önemlisi - istisnadan kurtulmuş olsanız bile, daha yüksek olan şeylerin normal seyri almadığını bildirin.

Yazılımın çeşitli hiyerarşiler, katmanlar veya soyutlamalar açısından işlevselliğini (normal) görme şeklimiz, istisnaları şiddetlerine ve ortaya çıktıkları kapsama göre sınıflandırmalı ve sistemin diğer kısımlarını etkiliyor - tanımlayan bu tür farklı istisnaların mümkün olan en iyi şekilde nasıl ele alınacağı.

En iyi referans: Code Craft bölüm 6 - indirilebilir


1

Hata ayıklama derlemeleri sırasında hataların kontrol edilmesi, bir BAD IDEA (tm), serbest bırakma bindirmeleri altında yığın üzerinde yeniden kullanılabilir değişkenleri derler, koruma sayfalarını kaldırır, hesaplamalarla havalı numaralar yapar, ağır artritleri önceden hesaplanmış vardiyalarla değiştirir vb.

Sürümde hata denetimi de kullanın, şöyle basit bir şeye başvurabilirsiniz:

if(somethinghitthefan)
     abort();

Bu aynı zamanda uygulama daha iyi test PC'de çökmeye başladığında kesinlikle hatayı görmezden gelmeyecek çok iyi bir yan etkisi vardır.

Olay izleyicileri ve günlükleri, abort()bunlara kim baksa da tamamen yararsızdır ?


exit / abort == şimdiye kadarki en kötü kullanıcı deneyimi: uygulama nedenini söylemeden kayboluyor ..
stijn

@stijn: aborthata ayıklayıcıya geçer / döküm oluşturur. exitkötü, evet. Yine __asm int 3de en çok tercih ediyorum .
Coder

bu doğrudur ve C / C ++ ile __asm ​​int 3 kullanarak da ekleme yazma eğilimindeyim, ama asla neden en azından bir açıklama göstermeden ve tercihen de çizgi ve dosya. Sonra en azından müşteri tam olarak ne olduğu hakkında bilgi verebilir.
stijn

0

Yapabileceğiniz çeşitli şeyler
1.Okup çevrimiçi çok sayıda kod okuyun ve asimile edin ve nasıl yapıldığını görün
2. Hata bölgelerini bulmanıza yardımcı olmak için bazı hata ayıklama araçlarını
kullanın 3. Uygunsuz atamalar nedeniyle önemsiz hataların farkında olun ve sözdizimi hataları.
4. Bazı kötü hatalar bulmak zor programdaki mantıksal hatalar nedeniyle oluşur.Bunun için kalem ve bulmak ya da daha karmaşık olanlar için insanlarla konuşmaya çalışın veya yardım almak için Stackoverflow , Wikipedia , google gibi kaynakları kullanın insanlar.

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.