Vilka är de bästa metoderna för felhantering i JavaScript?


Jag vill börja göra min JavaScript lite mer felfri, och jag hittar mycket dokumentation om att använda try, catch, finally och throw, men jag hittar inte mycket råd från experter om när och var man ska kasta fel.

  • Bör varje kodavsnitt vara inneslutet i en try/catch?
  • Finns det mer råd som detta om vid vilken punkt fel bör fångas?
  • Finns det nackdelar med att kasta fel istället för att låta koden misslyckas tyst i produktion?
  • Detta har berörts på SO vad gäller implementationer, men är server-loggning av JS-fel en effektiv strategi?
  • Något annat jag borde veta om att fånga fel i min applikation?

Jag är också helt öppen för att höra om böcker som har bra kapitel eller djupgående förklaringar av felhantering. Eloquent JavaScript berör ämnet, men är inte särskilt vägledande eller åsiktsfull om frågan.

Tack för alla råd du kan ge!

Svar #1

Ett oerhört intressant set med bilder om Enterprise JavaScript-felhantering kan hittas på https://web.archive.org/web/20140126104824/http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/

Sammanfattningsvis summerar det:

  1. Anta att din kod kommer att misslyckas
  2. Logga fel till servern
  3. Du, inte webbläsaren, hanterar fel
  4. Identifiera var fel kan uppstå
  5. Kasta dina egna fel
  6. Skilj på dödliga och icke-dödliga fel
  7. Tillhandahåll ett felsökningsläge

Slidesen går in på mycket mer detaljer och kommer troligen att ge dig någon riktning.

REDIGERA:

Presentationen som nämns ovan kan hittas här: https://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation

Svar #2

Nicholas Zakas, känd från Yahoo!, höll ett föredrag om Enterprise Error Handling (bilder) på Ajax Experience 2008, där han föreslog något i stil med detta:

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;
}

Ett år senare publicerade Nicholas Zakas en uppdatering på sin blogg som inkluderade ett smart mönster för att automatiskt infoga felhanteringskod i din produktionsmiljö (med aspektorienterad programmering).

När du börjar logga window.error-anrop kommer du att märka två saker:

  1. Om din webbplats är ganska komplex kommer du att logga många fel
  2. Du kommer att se en massa värdelösa "window.error in undefined:0"-meddelanden

Att minska floden av loggposter är lika enkelt som att testa för allvarlighetsgrad och/eller ett slumpmässigt nummer innan man loggar till servern:

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);
}

Att hantera de värdelösa window.error in undefined:0-felen beror på din webbplats arkitektur, men du kan försöka identifiera alla Ajax-anrop och kasta ett undantag när något misslyckas (möjligen genom att returnera en stacktrace med stacktrace.js).

Relaterade artiklar