JavaScript hata işleme için en iyi uygulamalar nelerdir?


137

Benim JavaScript biraz daha hata kanıt yapmaya başlamak için arıyorum, ben kullanımıyla ilgili belgelerin bol buluyorum try, catch, finally, ve throw, ama hataları atmak ne zaman ve nerede uzmanlardan tavsiye bir ton bulamıyorum.

  • Her kod parçası bir dene / yakala ile sarmalanmalı mı?
  • Gibi daha tavsiye var mı bu hangi noktada hatalara yakalanmış gerektiğini?
  • Üretimde kodun sessizce başarısız olması yerine hataları yükseltmenin dezavantajları var mı?
  • Buna, uygulamalara kadar SO'da değinildi, ancak sunucu günlük JS hatalarını etkili bir strateji mi var?
  • Başvurumdaki yakalama hatalarıyla ilgili bilmem gereken başka bir şey var mı?

Ayrıca, hata işlemenin harika bölümleri veya derinlemesine açıklamaları olan kitapları duymaya tamamen hazırım. Eloquent JavaScript konuya değiniyor, ancak konu hakkında çok kuralcı veya fikir sahibi değil.

Verebileceğin her türlü tavsiye için teşekkürler!


Elbette, bir şeyler ters giderse ne kadar olağanüstü başarısız olduğunuza ve olası hata mesajlarının hacmine bağlıdır. Hata günlüğü dizininiz dolu olduğu için başarısız olmak istemezsiniz, değil mi? - Buraya hiç baktın mı? stackoverflow.com/search?q=error+logging+javascript
mplungjan

@mplungjan - Oradaki yanıtları taradım, ancak çok fazla standart görünmüyordu ve Javascript hata işleme / istisna en iyi uygulamaları için yapılan aramalar hiçbir sonuç vermedi, bu yüzden hem benim hem de kendi anlayışları ve gelecekteki arayışçılar. Belki de bu, en iyi uygulamaları reçetelemenin mümkün olmadığı, ancak her durumun son derece benzersiz olduğu bir konudur?
Joshua Cody

1
"Her kod parçası bir dene / yakala ile sarmalanmalı mı?" Tabii ki değil. Her zaman işe yarayacağını bildiğiniz pek çok kod vardır (tabii ki test ettiğinizi varsayarsak, ama dene / yakala'nın amacı, kodlama hatalarını yakalamak ya da bunlardan kurtulmak değildir). Yalnızca kendi kontrolü dışındaki bir şeyden dolayı bazen başarısız olabilecek kodu sarmalayın, genellikle kaynak erişimi gibi şeyler. tarayıcılar arası sorunları ele alan ve bir hata işleyici işlevi belirlemenize izin veren birçok kitaplık vardır.
nnnnnn

1
Bu iyi bir soru Josh, +1. Etrafta çok fazla sözdizimsel tavsiye var ama sizin de söylediğiniz gibi bu işin kolay kısmı. Bu sorunun cevabında ( stackoverflow.com/questions/2825427/… ), İstisnaların JS'de yaygın olarak kullanılmadığı ve nedenlerinin verildiği açıklanmasına değinilmiştir.
whitneyland

Yanıtlar:


63

Enterprise JavaScript Error Handling hakkında son derece ilginç bir slayt seti http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/ adresinde bulunabilir.

Kısaca özetliyor:

  1. Kodunuzun başarısız olacağını varsayın
  2. Sunucuya hataları günlüğe kaydet
  3. Hataları tarayıcı değil siz halledin
  4. Hataların nerede oluşabileceğini belirleyin
  5. Kendi hatalarınızı atın
  6. Önemli ve önemli olmayan hataları ayırt edin
  7. Bir hata ayıklama modu sağlayın

Slaytlar çok daha fazla ayrıntıya giriyor ve büyük olasılıkla size biraz yön verecek.

GÜNCELLEME

Yukarıda bahsedilen sunum burada bulunabilir: http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation


24
Devhands bağlantısı koptu.
Ryan Gates

7
Bunu 2017'de okuyanlar için, slaytlardan fazla bir değer elde edemeyeceğinizi iddia ediyorum - bu özet size bilgilerin% 90'ını veriyor. Hala değerli bilgilerdir. Şerefe!
Philippe Hebert

29

Yahoo! Nicholas Zakas fame , Ajax Experience 2008'de Enterprise Error Handling ( slaytlar ) üzerine bir konuşma yaptı ve şöyle bir şey önerdi:

function log(sev,msg) {
    var img = new Image();
    img.src = "log.php?sev=" +
        encodeURIComponent(sev) +
        "&msg=" + encodeURIComponent(msg);
}

// usage
log(1, "Something bad happened.")

// Auto-log uncaught JS errors
window.onerror = function(msg, url, line) {
    log(1, msg);
    return true;
}

Bir yıl sonra, Nicholas Zakas kendi blogunda , üretim ortamınıza hata işleme kodunu otomatik olarak enjekte etmek için akıllı bir model içeren bir güncelleme yayınladı (görünüm odaklı programlama kullanarak).

Window.error çağrılarını günlüğe kaydetmeye başladığınızda, iki şey fark edeceksiniz:

  1. Siteniz oldukça karmaşıksa, birçok hata günlüğe kaydedeceksiniz
  2. Undefined: 0 "iletilerinde bir sürü yararsız" window.error "göreceksiniz

Günlük girişlerinin torrentini azaltmak, sunucuya giriş yapmadan önce önem derecesini ve / veya rastgele bir sayıyı test etmek kadar basittir:

function log(sev,msg) {
    if (Math.random() > 0.1) return; // only log some errors

    var img = new Image();
    img.src = "log.php?sev=" +
        encodeURIComponent(sev) +
        "&msg=" + encodeURIComponent(msg);
}

Gereksiz "window.error in undefined: 0" hatalarının işlenmesi site mimarinize bağlıdır, ancak tüm Ajax çağrılarını tanımlamayı ve bir şey başarısız olduğunda bir istisna atmayı deneyebilirsiniz (muhtemelen stacktrace.js kullanarak bir yığın izleme döndürme ).


67
Bunun eski bir soru olduğunu biliyorum, ancak bazı hataları rastgele görmezden gelmeyi önermek şimdiye kadar duyduğum en kötü fikirlerden biri.
jbabey

26
@jbabey: Küçük bir site için haklısınız, ancak 100.000 veya milyonlarca kullanıcısı olan büyük bir siteyi çalıştırıyorsanız, sunucularınızı (veya interneti) gereksiz günlük kaydı talepleriyle doldurmanıza gerçekten gerek yoktur. Yeterince büyük bir sistemde, her gerçek hata günde on binlerce kez meydana gelecektir, bu nedenle bu sınırlama biçimi gayet iyi çalışır. Fikir aslında Facebook'ta uygulanıyor.
Jens Roland

1
Hata ayıklama modundayken hataların günlüğe kaydedilmesi, üretim hatası raporlarının sınırlandırılması kadar büyük olasılıkla önemlidir; bu nedenle, günlük kaydı eşiğini sınırlayan bu değeri yönetmek için bir çözüme ihtiyaç olduğu not edilebilir.
frattaro

2
@NickBull 2011-2012'de bir grup Facebook JavaScript modülünü tersine mühendislik uyguladım; onu bulduğum yer burası.
Jens Roland

1
@NickBull eski dosyalarımı kontrol etti, hala bunlara sahipti. Bu numarayı Facebook bootloader modülünde buldum: if (global.logJSError) if (Math.random() < .01) logJSError('bootloader', {(kuşkusuz ki kod tüm hataları değil, yalnızca belirli bir zaman aşımı hatası sınıfını azaltmaz)
Jens Roland

7

IHMO, diğer birkaç dilde (AFAIK: Python, Java) yaptığınız gibi javascript'te hata işlemeyi kullanmalısınız.

Daha iyi okunabilirlik (ve muhtemelen daha iyi performans, gerçekten büyük bir etkisi olduğundan emin olmasam da) için, çoğunlukla aşağıdaki durumlarda dene / yakala bloğunu kullanmalısınız:

  • Kodun sarmak istediğiniz kısmı bir anahtardır kısmı, tüm algoritmanın parçasıdır . Başarısız olursa, şunları yapabilir:

    • kodların sonraki bölümünde hatalar oluşturun (örneğin bir var eksik olduğu için ...)
    • sayfanın beklenilen gibi görünmemesini sağlayın (içerik veya css üzerindeki etkisi)
    • sonuçların kullanıcıya garip görünmesini sağlayın (kod davranışı üzerindeki etkisi)
  • Yazdığınız kodun her tarayıcıyla uyumlu olmadığını biliyorsunuz

  • Sen planladın Kodun başarısız olabileceğini (çünkü çalışıp çalışmadığını kontrol etmenin başka bir yolu olmadığından if ... sonra ... bloklar)
  • Ve ayrıca hata ayıklamak istediğinizde son kullanıcıyı rahatsız etmeden

Sonunda, javascript uzmanlarının verecek başka unsurları olabilir.

kutuya 2 sentim,

Saygılarımızla,

maksimum


1
"Sarmalamak istediğiniz kod parçası, tüm algoritmanın önemli bir parçasıdır" - başarısızlığı nasıl ele almak istediğinize bağlı olabilir. Başarısızlık durumunda algoritmaya devam etmenin bir yolu olmadığını biliyorsanız, her şeyi bir dene / yakala'ya sarmak daha iyi olabilir çünkü eğer dene / yakala (örneğin) iç içe döngüler içine gömülü ise, daha çok performans vuruşu olacaktır. . Öte yandan, istisna konusunda bazı işlemler yapabilir ve algoritmaya devam ederseniz, o zaman daha ayrıntılı bir dene / yakala kurulumuna ihtiyacınız olacaktır.
nnnnnn

5

Diğer yanıtlara ek olarak: önemli bir şey, JavaScript hata nesnelerinde ve işlev parametrelerinde bulunan bağlam verilerini kullanmaktırwindow.onerror .

Stacktrace (errorObject.stack), dosya adı, satır numarası ve sütun numarası gibi şeyler. Her tarayıcının bazı farklılıkları olduğunu unutmayın ... bu nedenle güzel hatalar almak için elinizden gelenin en iyisini yapın.

Konsol nesnesinin kendisinde bile sorunlar olabilir . Bundan esinlenen özel bir window.onerror işlevi ve bu koddan esinlenen herhangi bir standart hata nesnesini izlemek için özel bir işlev kullanıyorum .

Bir başka iyi nokta da, web uygulamanızın sürümünü yığın izine yakın bir yere eklemektir (hızlı ve güvenli kopyalama ve yapıştırma için). Ayrıca geliştiriciler tarayıcı konsolunu sürekli izlemeyecekleri ve bazı sorunları görmeyebilecekleri için geliştirme modunda hataları daha agresif bir şekilde (uyarı ...) gösterebilirsiniz.

Ayrıca kullanmaktan kaçının throw 'My message', kullanın throw new Error('My message'), hatta özel hatalarınız olabilir, bu makaleyi okuyun .

Hatalara her zaman biraz bağlam ekleyin (sürüm, nesnenin kimliği, bazı özel mesajlar, ...) ve ayrıca harici hatalar (bazı harici veriler veya sisteminizin başarısız olmasına neden olan durumlar) ile dahili hatalar arasında bir ayrım yaptığınızdan emin olun. / assertions (kendi sisteminiz karıştı), ' Sözleşmeye göre tasarım ' konusunu okuyun .

İşte bir rehber .

Ayrıca, kütüphaneleriniz ve çerçeveleriniz için engelleyiciler gibi genel hata işlemeyi kullanmayı düşünün:

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.