Hata kötü uygulamayı bastırıyor mu?


14

Bir SO sorusu üzerine sordum burada herhangi birinden cevap, ben hakkında emin bazı kod hakkında "BTW, korkunç kod var. O sembol (@) çok bastırmak hatayı kullanır"

Bunun kötü uygulama olmasının bir nedeni var mı? Gibi şeyler ile:

$db=@new mysqli($db_info) or die('Database error');

, yalnızca özel bir hata mesajı görüntülememi sağlıyor. Hata bastırma olmadan, tipik PHP mesajını göstermeye devam eder:

Uyarı : mysqli :: mysqli (): php_network_getaddresses: getaddrinfo başarısız oldu: Böyle bir ana bilgisayar bilinmiyor. içinde bazı \ dosya \ yolu üzerinde hat 6

yanı sıra 'Veritabanı hatası'.

Hata bastırma her zaman kötü mü ve eğer öyleyse, yukarıdakiler hakkında özellikle kötü olan şey nedir?

Güncelleme: kullandığım gerçek kod:

or error('Datatabase error', 'An error occurred with the database' . (($debug_mode) ? '<br />MySQL reported: <b>' . $db->error . '</b><br />Error occurred on line <b>' . __LINE__ . '</b> of <b>' . __FILE__ . '</b>' : ''))

önceki tüm çıktıları siler ve bir hata mesajı görüntüler. Bu nedenle, hata mesajının özel olarak ne olduğu hakkında ayrıntılar içermemesi (ki bu, hata bastırma işleminin kötü olmasının bir nedeni olarak öne sürülen) önemsizdir.


9
Kötü uygulama yaparken göz bağı takmak mı?
Damien Roche

Bu nasıl ciddi bir soru olabilir? Hata ayıklamak için saatler süren kod yazmak isterseniz, hataların bastırılması iyi bir şey olurdu sanırım. Bir düşünün, uygulamanız başarısız oluyor, verileri bozuyor ... ve kodun neden veya nerede olduğunu bilmek istemiyorsunuz. Bu ne zaman iyi bir fikir olur? Arkadaşlarınızı üzerinde battaniye partisi yapmaya davet etmelisiniz ... aynı mantığı takip ediyor.
Bazı Ücretsiz Masonlar

1
@SomeFreeMason Eğer hata ayıklamak gerekirse o zaman ben sadece $ debug_mode DOĞRU olarak ayarlamak istiyorum, çünkü gerçek kod kullanıyorum:or error('Datatabase error', 'An error occurred with the database' . (($debug_mode) ? '<br />MySQL reported: <b>' . $db->error . '</b>' : ''))

@Paradoxical: PHP'de istisna / hata işleme durumunun biraz FUBAR olduğunu fark ettim, ancak PHP yapılandırmanızdaki hataların görsel görüntüsünü kapatabileceğinizin farkındasınız, değil mi?
Phoshi

@Phoshi Ne yazık ki kullandığım barındırma hizmeti bana php.ini erişim vermiyor

Yanıtlar:


14

Hatayı bastırarak doğru şeyi yaptığınızı düşünüyorum, çünkü kendi hata işlemenizi gerçekleştiriyorsunuz.

Java'daki eşdeğerini düşünmek daha kolay olabilir. Kullanarak hatayı bastırmak, @bir istisnayı yutmaya benzer. Sizinkine benzer aşağıdaki kod makul:

try {
    db = new MySQLi(dbInfo);
} catch (SQLException connectionFailure) {
    die("Database error");
}

(Eh, Java'da sunucu uygulaması motorunun ölmesini istemezsiniz, ancak fikri anlarsınız.)

Ancak, bu kabul edilemez:

try {
    db = new MySQLi(dbInfo);
} catch (Exception e) {
}

Çoğu PHP hata bastırma, dikkatsizce, son örneğe benzer şekilde yapılır, bu nedenle kodunuza karşı diz sarsıntısı reaksiyonu.


3
İstisna yakalamak ve sadece "idare" olmak için yürütmeyi durdurmak çağırmak olmaz. Sorunu çözebilirseniz, harika, bunu yapın. Eğer yapamazsan, onu yakalamak için ne yapıyorsun? Bunun için üst düzey istisna işleyicileri var. Bu durumda istisnaları yakalamak, kod tabanınızın her tarafına yayılmış hata işleme kodunuz olduğundan emin olmaktır.
Phoshi

7

Hata bastırma kötüdür, çünkü sadece bildiğiniz bilgileri gizlemekle kalmaz (bir şeyler ters gitti). Ayrıca, farkında olmadığınız hata ayıklama için hayati bilgileri de gizleyebilir ( ne , nerede ve neden ).

Bu özel örnekte, “ Veritabanı hatası ” çok iyi bir hata mesajı değildir. DB ile ilgili bir şeyler ters gitti. Çok aydınlatıcı değil. “ Uyarı: mysqli :: mysqli (): php_network_getaddresses: getaddrinfo başarısız oldu: Böyle bir ana bilgisayar bilinmiyor. 6 \ 'daki bazı \ dosya \ yolunda aslında daha iyi bir hata mesajıdır. Sorunun yerini ve nedenini verir. Hata önceden bulunduğundan sağa atlayabilir ve hata ayıklamaya başlayabilirsiniz.

Tabii ki, kütüphane tasarımcıları bazen ilgisiz uyarılara yol açma eğilimindedir. Ben ilgilenmiyorum uyarıları filtrelemek için bir yolu olup olmadığını bilmek için yeterince iyi PHP bilmiyorum. Bir yüz satır stacktrace üzerinden okuma çok aydınlatıcı olmadığını biliyorum. Ancak çok fazla bilgiye doğru yanıt, bilgi miktarını sıfıra düşürmek değil , bir aşamada alakasız parçaları filtrelemektir. @Operatör bu ayrıntı düzeyini ( 's sloganı yok hep ya hiç ) ve bu nedenle etkili hata yönetimi için uygun bir araç değildir.

Belli bir hatanın ortaya çıkacağını ve asıl sorunun düzeltilmesinin mesajı susturmaktan (ve bundan kaynaklanan potansiyel hataya maruz kalmaktan) daha pahalı olduğunu bildiğiniz bazı durumlar vardır . Bu bir kerelik bir senaryoda olabilir, ancak parmaklarınızı kulaklarınıza yapıştırmak ve “ la la la ” gitmek (potansiyel) hatalara profesyonel bir yanıt değildir .


5
Kullanıcılarınıza kesin hatayı söylemek istemezsiniz. Onlara hatanın sizin tarafınızda olduğunu ve üzerinde çalıştığınızı bildirirsiniz. Sunucunuzdaki hataları günlüğe kaydedebilir ve uyarıları otomatik olarak öğrenmeniz için ayarlayabilirsiniz, ancak bu hataları kullanıcıya göstermek için bir neden yoktur.
Jeroen Vannevel

1
Canlı bir sitede, tipik bir kullanıcının "mysqli hakkında bazı teknik çöpler" yerine, görüntülenebilecekleri anlayabileceği bir hata mesajı için elbette daha iyi olur mu? Eğer hata ayıklamak için çalışıyorsanız, o zaman hata bastırma kaldırmak, ama canlı bir sitede, tam hata görüntülenmesi gerektiğini kabul etmiyorum.

3
@Paradoxical Ciddi bir sitede, "veritabanı hatası" gibi bir hata mesajı görüntülemez ve başka bir şey göstermezsiniz. Her dieikisi için de uygun olmayan çok sayıda ekstra tüy, stil, altbilgi vb. İçeren genel bir "dahili sunucu hatası" sayfası görüntülersiniz . Ve ayrıntılı bilgiler kullanıcıya ne gösterdiğinizden bağımsız olarak bir günlüğe yazılmalıdır .

1
Ekranda kullanıcı dostu bir mesaj sunmanın ve teknik mesajı bir günlük dosyasına yazmanın bir yolu yok mu?
SinirliWithFormsDesigner

3
display_errorskapalı, log_errorsaçık, ve bir hatayı algılamak için istediğiniz gibi yapın, ama onları atmayın.
Wrikken

0

Hataları bastırmak kötüdür, çünkü çoğu zaman farkında bile olmadığımız problemi gizler ve bazı kritik uygulamalarda, örneğin finans, sağlık ve savunma alanlarında kullanılan uygulamalarda çok maliyetli olabilecek beklenmedik davranışlarla sonuçlanabilir.

Kodda işlenmeyen istisnalar olması ve kullanıcıya gerçek hata mesajlarını göstermesi de iyi bir fikir değildir, çünkü güvenlik sorunlarına neden olabilir, çünkü hata mesajları genellikle kodunuz hakkında kötü niyetli kullanıcıların ve bilgisayar korsanlarının manipüle etmesine yardımcı olabilir. sistemi.

Bu nedenle iyi uygulama, farklı düzeylerde hataları ele almaktır, örneğin en yüksek düzeyde hatayı, sadece gerçek hatayı kaydederek ve kullanıcıya basit ve kullanıcı dostu bir mesaj göstererek işleyebilirsiniz.


0

Evet, hata bastırma operatörü genellikle kötü bir fikirdir.

Hata raporlamayı yapılandırmada ( php.ini) yönetmelisiniz . Böylece her ortam için farklı bir ayar seçebilirsiniz (örn. Geliştirme sırasında uyarıları bırakın ve bunları üretimde gizleyin).

Kullanırken @mantıklı olabilecek tek durum, diğer geliştiriciler için bir kütüphane geliştirmenizdir. Gönüllü olarak uyarı oluşturan bir şey yapmayı seçerseniz ve kitaplığınızın kullanıcılarını bunlara bağlı olmayan bir uyarı ile rahatsız etmek istemiyorsanız, @bir çözüm olabilir.

Başka bir kullanım düşünemiyorum.

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.