{"id":41944,"date":"2022-02-10T11:41:09","date_gmt":"2022-02-10T10:41:09","guid":{"rendered":"https:\/\/kinsta.com\/nl\/?p=41944&#038;preview=true&#038;preview_id=41944"},"modified":"2023-07-06T11:03:31","modified_gmt":"2023-07-06T09:03:31","slug":"fouten-in-javascript","status":"publish","type":"post","link":"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/","title":{"rendered":"De definitieve handleiding voor het omgaan met fouten in JavaScript"},"content":{"rendered":"<p>Murphy&#8217;s wet stelt dat alles wat fout kan gaan uiteindelijk fout een keer zal gaan. Helaas is de programmeerwereld een van de plekken waar deze wet net iets te goed op toegepast kan worden. Bij het maken van een applicatie is de kans groot dat je bugs en andere problemen veroorzaakt en daarbij zijn fouten in JavaScript een veelvoorkomend probleem!<\/p>\n<p>Het succes van een softwareproduct hangt af van hoe goed de makers deze problemen kunnen oplossen voordat ze gebruikers hier last van krijgen. En <a href=\"https:\/\/kinsta.com\/nl\/blog\/wat-is-javascript\/\">JavaScript<\/a> is &#8211; van alle <a href=\"https:\/\/kinsta.com\/nl\/blog\/beste-programmeertaal-om-te-leren\/\">programmeertalen<\/a> &#8211; berucht voor de manier waarop foutafhandeling is ingericht.<\/p>\n<p>Als je een <a href=\"https:\/\/kinsta.com\/nl\/blog\/javascript-bibliotheken\/\">JavaScript applicatie bouwt<\/a>, is de kans groot dat je op een of ander moment met data types in de war haalt. Mocht dit specifieke scenario je bespaard zijn gebleven, dan heb je vast wel eens een <em>undefined <\/em>voor een <em>null <\/em>ingeruild of een triple equals operator (<code>===<\/code>) vervangen door een double equals operator (<code>==<\/code>).<\/p>\n<p>Het is dan ook menselijk om fouten te maken en het overkomt iedereen. En daarom laten we je alles zien wat je moet weten over hoe je met fouten omgaat in JavaScript.<\/p>\n<p>Dit artikel leidt je door de basic fouten in JavaScript en legt de verschillende fouten uit die je kunt tegenkomen. Je leert vervolgens hoe je deze fouten kunt identificeren en oplossen. Er zijn ook een aantal tips om effectief om te gaan met fouten in productieomgevingen.<\/p>\n<p>Laten we maar snel beginnen!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h3>Bekijk onze videogids over het <a href=\"https:\/\/www.youtube.com\/watch?v=CQzwi9_7wHI\">omgaan met JavaScript fouten<\/a><\/h3>\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=CQzwi9_7wHI\"><\/kinsta-video>\n<h2>Wat zijn JavaScript fouten?<\/h2>\n<p>Fouten bij het programmeren verwijzen naar situaties waarin een programma niet functioneert zoals het zou moeten. Het kan voorkomen wanneer een programma niet weet hoe het de taak moet afhandelen, zoals wanneer het probeert een niet-bestaand bestand te openen of een webgebaseerd API endpoint probeert te bereiken terwijl er geen netwerkverbinding is.<\/p>\n<p>Deze situaties zorgen ervoor dat het programma fouten naar de gebruiker stuurt en stelt dat het niet weet wat er nu moet gebeuren. Het programma verzamelt zoveel mogelijk informatie over de fout en meldt vervolgens dat het niet verder kan.<\/p>\n\n<p>Intelligente developers proberen deze scenario\u2019s voor te zijn en zich in te dekken, zodat de gebruiker niet zelf <a href=\"https:\/\/kinsta.com\/nl\/blog\/http-status-codes\/\">een technische foutmelding als &#8220;404&#8221;<\/a> hoeft uit te vogelen. In plaats daarvan tonen ze een veel begrijpelijker bericht: \u201cThe page could not be found.\u201d<\/p>\n<p>Fouten in JavaScript zijn objecten die worden weergegeven wanneer er een programmeerfout optreedt. Deze objecten bevatten veel informatie over het type fout, de instructie die de fout heeft veroorzaakt en de stack trace op het moment dat de fout optrad. JavaScript stelt programmeurs ook in staat om custom errors (aangepaste fouten) te maken om extra informatie te verstrekken bij het oplossen van problemen.<\/p>\n<h3>Eigenschappen van een fout<\/h3>\n<p>Nu de definitie van een JavaScript fout duidelijk is, is het tijd om dieper in de materie te duiken.<\/p>\n<p>Fouten in JavaScript hebben bepaalde standaard- en aangepaste eigenschappen die helpen de oorzaak en gevolgen van de fout te begrijpen. Fouten in JavaScript bevatten standaard drie eigenschappen:<\/p>\n<ol>\n<li><strong>message<\/strong>: Een tekenreekswaarde die het foutbericht overbrengt<\/li>\n<li><strong>name<\/strong>: Het type fout dat zich heeft voorgedaan (we zullen hier dieper op ingaan in de volgende sectie)<\/li>\n<li><strong>stack<\/strong>: De stack trace van de uitgevoerd code toen de fout optrad.<\/li>\n<\/ol>\n<p>Bovendien kunnen fouten ook eigenschappen bevatten zoals <em>columnNumber, lineNumber, fileName, <\/em>enz. om de fout beter te beschrijven. Deze eigenschappen zijn echter niet standaard en kunnen al dan niet aanwezig zijn in elk foutobject dat door jouw JavaScript applicatie wordt gegenereerd.<\/p>\n<h3>Stack trace begrijpen<\/h3>\n<p>Een stack trace is de lijst met method calls waarin een programma zich bevond toen een event, zoals een uitzondering of een waarschuwing, plaatsvond. Dit is hoe een voorbeeld stack trace, vergezeld door een uitzondering, eruitziet:<\/p>\n<figure id=\"attachment_110237\" aria-describedby=\"caption-attachment-110237\" style=\"width: 1138px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110237 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/type-error-output-numeric.png\" alt=\"Voorbeeld van een stack trace.\" width=\"1138\" height=\"278\"><figcaption id=\"caption-attachment-110237\" class=\"wp-caption-text\">Voorbeeld van een stack trace.<\/figcaption><\/figure>\n<p>Zoals je kunt zien, begint het met het afdrukken van de foutnaam en het bericht, gevolgd door een lijst met methoden die werden gecallt. Elke method call vermeldt de locatie van de source code en de regel waarop deze werd gecallt. Je kunt deze gegevens gebruiken om door je codebase te navigeren en te identificeren welk stuk code de fout veroorzaakt.<\/p>\n<p>Deze lijst met methoden is \u201cstacked\u201d gerangschikt. Het laat zien waar je uitzondering voor het eerst werd gegenereerd en hoe deze zich verspreidde via de stacked method calls. Als je een catch voor de uitzondering implementeert, kan deze zich niet door de stack verspreiden en je programma laten crashen. In sommige scenario&#8217;s wil je echter mogelijk fatale fouten onopgemerkt laten om het programma opzettelijk te laten crashen.<\/p>\n<h3>Fouten vs uitzonderingen<\/h3>\n<p>De meeste mensen beschouwen fouten en uitzonderingen meestal als hetzelfde. Het is echter essentieel om een klein maar fundamenteel verschil tussen de twee op te merken.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Een uitzondering is een foutobject dat is gegenereerd.<\/p>\n<\/aside>\n\n<p>Laten we een kort voorbeeld nemen om dit beter te begrijpen. Dit is hoe je een fout in JavaScript kunt defini\u00ebren:<\/p>\n<pre><code class=\"language-js\">const wrongTypeError = TypeError(\"Wrong type found, expected character\")<code><\/code><\/code><\/pre>\n<p>En zo wordt het <code><em>wrongTypeError<\/em><\/code> \u00a0object een uitzondering:<\/p>\n<pre><code class=\"language-js\">throw wrongTypeError<\/code><\/pre>\n<p>De meeste mensen hebben echter de neiging om de shorthand vorm te gebruiken die foutobjecten definieert terwijl ze worden gegenereerd:<\/p>\n<pre><code class=\"language-js\">throw TypeError(\"Wrong type found, expected character\")<\/code><\/pre>\n<p>Dit is de standaardpraktijk. Het is echter een van de redenen waarom ontwikkelaars de neiging hebben om uitzonderingen en fouten door elkaar te halen. Daarom is het essentieel om de grondbeginselen te kennen, ook al gebruik je shorthands om je werk snel gedaan te krijgen.<\/p>\n<h2>Soorten fouten in JavaScript<\/h2>\n<p>Er is een reeks vooraf gedefinieerde fouttypen in JavaScript. Ze worden automatisch gekozen en gedefinieerd door de JavaScript runtime wanneer de programmeur niet expliciet fouten in de applicatie afhandelt.<\/p>\n<p>In dit gedeelte word je door enkele van de meest voorkomende soorten fouten in JavaScript geleid en begrijp je wanneer en waarom ze optreden.<\/p>\n<h3>RangeError<\/h3>\n<p>Er wordt een RangeError gegenereerd wanneer een variabele wordt ingesteld met een waarde buiten het bereik van de \u201clegal\u201d waarden. Het komt meestal voor bij het doorgeven van een waarde als argument aan een functie, en de gegeven waarde ligt niet in het bereik van de parameters van de functie. Het kan soms lastig zijn om deze fout op te lossen wanneer je beschikt over slecht gedocumenteerde externe bibliotheken, omdat je het bereik van mogelijke waarden moet kennen voordat de argumenten de juiste waarde kunnen doorgeven.<\/p>\n<p>Enkele veelvoorkomende scenario&#8217;s waarin RangeError optreedt, zijn:<\/p>\n<ul>\n<li>Proberen een array van illegale lengtes te maken via de array-constructor.<\/li>\n<li>Slechte waarden doorgeven aan numerieke methoden zoals <code>toExponential()<\/code>, <code>toPrecision()<\/code>, <code>toFixed()<\/code>, etc.<\/li>\n<li>Ongeldige waarden doorgeven aan tekenreeksfuncties zoals <code>normalize()<\/code>.<\/li>\n<\/ul>\n<h3>ReferenceError<\/h3>\n<p>Een ReferenceError treedt op wanneer er iets mis is met de reference van een variabele in je code. Mogelijk ben je vergeten een waarde voor de variabele te defini\u00ebren voordat je deze gebruikt, of probeer je een ontoegankelijke variabele in je code te gebruiken. Hoe dan ook, het doorlopen van de stack trace biedt voldoende informatie om de variabele referentie die de fout heeft te vinden en te repareren.<\/p>\n<p>Enkele veelvoorkomende redenen waarom ReferenceErrors optreden zijn:<\/p>\n<ul>\n<li>Een typefout maken in een variabelenaam.<\/li>\n<li>Proberen toegang te krijgen tot variabelen met een blokbereik buiten hun bereik.<\/li>\n<li>Verwijzen naar een globale variabele uit een externe bibliotheek (zoals <a href=\"https:\/\/kinsta.com\/nl\/blog\/jquery-is-not-defined\/\">$ uit jQuery<\/a>) voordat deze is geladen.<\/li>\n<\/ul>\n<h3>SyntaxError<\/h3>\n<p>Deze fouten zijn een van de eenvoudigste om op te lossen, omdat ze wijzen op een fout in de syntaxis van de code. Omdat JavaScript een <a href=\"https:\/\/kinsta.com\/nl\/blog\/scripttalen\/\">scripttaal<\/a> is die wordt ge\u00efnterpreteerd in plaats van gecompileerd, worden deze gegenereerd wanneer de app het script uitvoert dat de fout bevat. In het geval van gecompileerde talen worden dergelijke fouten tijdens het compileren ge\u00efdentificeerd. De binaire bestanden van de app worden dus pas gemaakt als deze zijn opgelost.<\/p>\n<p>Enkele veelvoorkomende redenen waarom SyntaxErrors kunnen optreden zijn:<\/p>\n<ul>\n<li>Ontbrekende aanhalingstekens<\/li>\n<li>Ontbrekende haakjes sluiten<\/li>\n<li>Onjuiste uitlijning van accolades (curly breaks) of andere tekens<\/li>\n<\/ul>\n<p>Het is een goede gewoonte om een linting tool in je IDE te gebruiken om dergelijke fouten voor je te identificeren voordat ze in de browser terechtkomen.<\/p>\n<h3>TypeError<\/h3>\n<p>TypeError is een van de meest voorkomende fouten in JavaScript apps. Deze fout wordt gemaakt wanneer een waarde niet van een bepaald verwacht type blijkt te zijn. Enkele veelvoorkomende gevallen waarin het optreedt, zijn:<\/p>\n<ul>\n<li>Objecten callen die geen methoden zijn.<\/li>\n<li>Poging om toegang te krijgen tot eigenschappen van null of undefined objecten<\/li>\n<li>Een tekenreeks als een getal behandelen of omgekeerd<\/li>\n<\/ul>\n<p>Er zijn veel meer mogelijkheden waar een TypeError kan optreden. We zullen later naar enkele bekende gevallen kijken en leren hoe we ze kunnen oplossen.<\/p>\n<h3>InternalError<\/h3>\n<p>Het type InternalError wordt gebruikt wanneer er een uitzondering optreedt in de JavaScript runtime engine. Het kan al dan niet wijzen op een probleem met je code.<\/p>\n<p>Vaak komt InternalError slechts in twee scenario&#8217;s voor:<\/p>\n<ul>\n<li>Wanneer een patch of een update van de JavaScript runtime een bug bevat die uitzonderingen genereert (dit gebeurt zeer zelden)<\/li>\n<li>Wanneer je code entiteiten bevat die te groot zijn voor de JavaScript engine (bijv. te veel switch cases, te grote array initializers, te veel recursie)<\/li>\n<\/ul>\n<p>De meest geschikte aanpak om deze fout op te lossen, is door de oorzaak te identificeren via het foutbericht en je app logica, indien mogelijk, te herstructureren om de plotselinge piek van de werkbelasting op de JavaScript engine te elimineren.<\/p>\n<h3>URIError<\/h3>\n<p>URIError treedt op wanneer een algemene URI verwerkingsfunctie zoals <code>decodeURIComponent<\/code> ongeldig wordt gebruikt. Het geeft meestal aan dat de parameter die aan de method call is doorgegeven, niet voldeed aan de URI standaarden en dus niet <a href=\"https:\/\/kinsta.com\/nl\/blog\/defer-parsing-of-javascript\/\">correct door de methode werd geparsed<\/a>.<\/p>\n<p>Het diagnosticeren van deze fouten is meestal eenvoudig, omdat je alleen de argumenten op malformation hoeft te onderzoeken.<\/p>\n<h3>EvalError<\/h3>\n<p>Een EvalError treedt op wanneer er een fout optreedt bij een functie call <code>eval()<\/code> De functie <code>eval()<\/code>wordt gebruikt om JavaScript code uit te voeren die is opgeslagen in tekenreeksen. Omdat het gebruik van de <code>eval()<\/code> functie echter ten zeerste wordt afgeraden vanwege beveiligingsproblemen en de huidige ECMAScript specificaties de <code>EvalError<\/code> klasse niet meer genereren, bestaat dit fouttype eenvoudigweg om achterwaartse compatibiliteit met oudere JavaScript code te behouden.<\/p>\n<p>Als je met een oudere versie van JavaScript werkt, kun je deze fout tegenkomen. In ieder geval is het het beste om de code die wordt uitgevoerd in de functie call <code>eval()<\/code>te onderzoeken op eventuele uitzonderingen.<\/p>\n<h2>Custom error types maken<\/h2>\n<p>Hoewel JavaScript een adequate lijst van klassen van error types (fouttype) biedt voor de meeste scenario&#8217;s, kun je altijd een nieuwe error type maken als de lijst niet aan jouw vereisten voldoet. De basis van deze flexibiliteit ligt in het feit dat je met JavaScript alles letterlijk kunt genereren met de \u00a0<code>throw<\/code> opdracht.<\/p>\n<p>Dus technisch gezien zijn deze verklaringen volledig geldig:<\/p>\n<pre><code class=\"language-js\">throw 8\nthrow \"An error occurred\"<\/code><\/pre>\n<p>Het genereren van een primitief gegevenstype geeft echter geen details over de fout, zoals het type, de naam of de bijbehorende stack trace. Om dit op te lossen en het foutafhandelingsproces te standaardiseren, is de <code>Error<\/code> klasse geleverd. Het wordt ook afgeraden om primitieve gegevenstypen te gebruiken terwijl uitzonderingen worden gegenereerd.<\/p>\n<p>Je kunt de <code>Error<\/code> \u00a0klasse uitbreiden om je aangepaste foutklasse te maken. Hier is een eenvoudig voorbeeld van hoe je dit kunt doen:<\/p>\n<pre><code class=\"language-js\">class ValidationError extends Error {\n    constructor(message) {\n        super(message);\n        this.name = \"ValidationError\";\n    }\n}<\/code><\/pre>\n<p>En je kunt het als volgt gebruiken:<\/p>\n<pre><code class=\"language-js\">throw ValidationError(\"Property not found: name\")<\/code><\/pre>\n<p>En je kunt het vervolgens identificeren met behulp van het trefwoord <code>instanceof<\/code>:<\/p>\n<pre><code class=\"language-js\">try {\n    validateForm() \/\/ code that throws a ValidationError\n} catch (e) {\n    if (e instanceof ValidationError)\n    \/\/ do something\n    else\n    \/\/ do something else\n}<\/code><\/pre>\n<h2>Top 10 meest voorkomende fouten in JavaScript<\/h2>\n<p>Nu je de veelvoorkomende fouttypen begrijpt en weet hoe je je aangepaste fouten kunt maken, is het tijd om een paar van de meest voorkomende fouten te bekijken die je tegenkomt bij het schrijven van JavaScript code.<\/p>\n<h3>1. Uncaught RangeError<\/h3>\n<p>Deze fout treedt op in Google Chrome in een aantal verschillende scenario&#8217;s. Ten eerste kan het gebeuren als je een recursieve functie aanroept en deze niet wordt be\u00ebindigd. Je kunt dit zelf bekijken in de Chrome Developer Console:<\/p>\n<figure id=\"attachment_110241\" aria-describedby=\"caption-attachment-110241\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110241 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/recur-range-error.png\" alt=\"RangeError voorbeeld met een recursieve functie call.\" width=\"1392\" height=\"492\"><figcaption id=\"caption-attachment-110241\" class=\"wp-caption-text\">RangeError voorbeeld met een recursieve functie call.<\/figcaption><\/figure>\n<p>Dus om een dergelijke fout op te lossen, moet je ervoor zorgen dat je de border cases van je recursieve functie correct definieert. Een andere reden waarom deze fout optreedt, is als je een waarde hebt doorgegeven die buiten het bereik van een functieparameter ligt. Hier is een voorbeeld:<\/p>\n<figure id=\"attachment_110239\" aria-describedby=\"caption-attachment-110239\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110239 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/toExponential-range-error.png\" alt=\"RangeError voorbeeld met toExponential() call.\" width=\"1392\" height=\"150\"><figcaption id=\"caption-attachment-110239\" class=\"wp-caption-text\">RangeError voorbeeld met toExponential() call.<\/figcaption><\/figure>\n<p>De foutmelding geeft meestal aan wat er mis is met je code. Zodra je de wijzigingen aanbrengt, wordt dit opgelost.<\/p>\n<figure id=\"attachment_110240\" aria-describedby=\"caption-attachment-110240\" style=\"width: 1396px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110240 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/toExponential-error-fixed.png\" alt=\"Output voor de functie call toExponential().\" width=\"1396\" height=\"100\"><figcaption id=\"caption-attachment-110240\" class=\"wp-caption-text\">Output voor de functie call toExponential().<\/figcaption><\/figure>\n<h3>2. Uncaught TypeError: Cannot set property<\/h3>\n<p>Deze fout treedt op wanneer je een eigenschap instelt op een ongedefinieerde referentie. Je kunt het probleem reproduceren met deze code:<\/p>\n<pre><code class=\"language-js\">var list\nlist.count = 0<code><\/code><\/code><\/pre>\n<p>Dit is de output die je ontvangt:<\/p>\n<figure id=\"attachment_110245\" aria-describedby=\"caption-attachment-110245\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110245 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/list-count-type-error.png\" alt=\"TypeError voorbeeld.\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110245\" class=\"wp-caption-text\">TypeError voorbeeld.<\/figcaption><\/figure>\n<p>Om deze fout op te lossen, initialiseer je de referentie met een waarde voordat je de eigenschappen opent. Zo ziet het eruit als het is opgelost:<\/p>\n<figure id=\"attachment_110246\" aria-describedby=\"caption-attachment-110246\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110246 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/list-count-fixed.png\" alt=\"Hoe TypeError op te lossen.\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110246\" class=\"wp-caption-text\">Hoe TypeError op te lossen.<\/figcaption><\/figure>\n<h3>3. Uncaught TypeError: Cannot read property<\/h3>\n<p>Dit is een van de meest voorkomende fouten in JavaScript. Deze fout treedt op wanneer je probeert een eigenschap te lezen of een functie te callen voor een ongedefinieerd object. Je kunt het heel gemakkelijk reproduceren door de volgende code uit te voeren in een Chrome Developer console:<\/p>\n<pre><code class=\"language-js\">var func\nfunc.call()<code><\/code><\/code><\/pre>\n<p>Hier is de output:<\/p>\n<figure id=\"attachment_110249\" aria-describedby=\"caption-attachment-110249\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110249 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/func-call-type-error.png\" alt=\"TypeError voorbeeld met ongedefinieerde functie.\" width=\"1100\" height=\"162\"><figcaption id=\"caption-attachment-110249\" class=\"wp-caption-text\">TypeError voorbeeld met ongedefinieerde functie.<\/figcaption><\/figure>\n<p>Een ongedefinieerd object is een van de vele mogelijke oorzaken van deze fout. Een andere prominente oorzaak van dit probleem kan een onjuiste initialisatie van de status zijn tijdens het weergeven van de gebruikersinterface. Hier is een praktijkvoorbeeld van een React applicatie:<\/p>\n<pre><code class=\"language-js\">import React, { useState, useEffect } from \"react\";\n\nconst CardsList = () =&gt; {\n\n    const [state, setState] = useState();\n\n    useEffect(() =&gt; {\n        setTimeout(() =&gt; setState({ items: [\"Card 1\", \"Card 2\"] }), 2000);\n    }, []);\n\n    return (\n        &lt;&gt;\n            {state.items.map((item) =&gt; (\n                &lt;li key={item}&gt;{item}&lt;\/li&gt;\n            ))}\n        &lt;\/&gt;\n    );\n};\n\nexport default CardsList;<\/code><\/pre>\n<p>De app start met een lege instance container en wordt na een vertraging van 2 seconden voorzien van enkele items. De vertraging wordt ingesteld om een netwerk call te imiteren. Zelfs als je netwerk supersnel is, heb je nog steeds te maken met een kleine vertraging waardoor de component minstens \u00e9\u00e9n keer wordt gerenderd. Als je deze app probeert uit te voeren, ontvang je de volgende foutmelding:<\/p>\n<figure id=\"attachment_110234\" aria-describedby=\"caption-attachment-110234\" style=\"width: 1180px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110234 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/undefined-type-error-output.png\" alt=\"TypeError stack trace in a browser.\" width=\"1180\" height=\"576\"><figcaption id=\"caption-attachment-110234\" class=\"wp-caption-text\">TypeError stack trace in a browser.<\/figcaption><\/figure>\n<p>Dit komt omdat op het moment van renderen de statuscontainer niet gedefinieerd is; er staan dus geen property <code>items<\/code> op. Het oplossen van deze fout is eenvoudig. Je hoeft alleen een initi\u00eble standaardwaarde op te geven voor de statuscontainer.<\/p>\n<pre><code class=\"language-js\">\/\/ ...\nconst [state, setState] = useState({items: []});\n\/\/ ...<\/code><\/pre>\n<p>Nu, na de ingestelde vertraging, toont je app een vergelijkbare output:<\/p>\n<figure id=\"attachment_110251\" aria-describedby=\"caption-attachment-110251\" style=\"width: 1180px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110251 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/cards-list-output.png\" alt=\"Code output.\" width=\"1180\" height=\"576\"><figcaption id=\"caption-attachment-110251\" class=\"wp-caption-text\">Code output.<\/figcaption><\/figure>\n<p>De exacte oplossing in je code kan anders zijn, maar de essentie hier is om je variabelen altijd correct te initialiseren voordat je ze gebruikt.<\/p>\n<h3>4. TypeError: &#8216;undefined&#8217; is not an object<\/h3>\n<p>Deze fout treedt op in Safari wanneer je toegang probeert te krijgen tot de eigenschappen van, of een methode callt op een ongedefinieerd object. Je kunt dezelfde code van boven uitvoeren om de fout zelf te reproduceren.<\/p>\n<figure id=\"attachment_110250\" aria-describedby=\"caption-attachment-110250\" style=\"width: 1146px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110250 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/func-call-type-error-undefined.png\" alt=\"TypeError voorbeeld met ongedefinieerde functie.\" width=\"1146\" height=\"172\"><figcaption id=\"caption-attachment-110250\" class=\"wp-caption-text\">TypeError voorbeeld met ongedefinieerde functie.<\/figcaption><\/figure>\n<p>De oplossing voor deze fout is dan ook hetzelfde &#8211; zorg ervoor dat je je variabelen correct hebt ge\u00efnitialiseerd en dat ze niet ongedefinieerd zijn wanneer een eigenschap of methode wordt geopend.<\/p>\n<h3>5. TypeError: null is not an object<\/h3>\n<p>Deze is, nogmaals, vergelijkbaar met de vorige fout. Het komt voor in Safari, en het enige verschil tussen de twee fouten is dat deze wordt gegenereerd wanneer het object waarvan de eigenschap of methode wordt benaderd, <code>null<\/code> is in plaats van <code>undefined<\/code>. Je kunt dit reproduceren door het volgende stuk code uit te voeren:<\/p>\n<pre><code class=\"language-js\">var func = null\n\nfunc.call()<\/code><\/pre>\n<p>Dit is de output die je ontvangt:<\/p>\n<figure id=\"attachment_110243\" aria-describedby=\"caption-attachment-110243\" style=\"width: 1146px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110243 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/null-object-error.png\" alt=\"TypeError voorbeeld met null functie.\" width=\"1146\" height=\"142\"><figcaption id=\"caption-attachment-110243\" class=\"wp-caption-text\">TypeError voorbeeld met null functie.<\/figcaption><\/figure>\n<p>Omdat <code>null<\/code> een waarde is die expliciet is ingesteld op een variabele en niet automatisch wordt toegewezen door JavaScript. Deze fout kan alleen optreden als je een variabele te openen die je zelf op <code>null<\/code> hebt ingesteld. Je moet dus je code opnieuw bekijken en controleren of de logica die je hebt geschreven correct is of niet.<\/p>\n<h3>6. TypeError: Cannot read property \u2018length\u2019<\/h3>\n<p>Deze fout treedt op in Chrome wanneer je de lengte van een <code>null<\/code> of <code>undefined<\/code> object probeert te lezen. De oorzaak van dit probleem is vergelijkbaar met de vorige problemen, maar het komt vrij vaak voor bij het afhandelen van lijsten; daarom verdient het een speciale vermelding. Zo kun je het probleem reproduceren:<\/p>\n<figure id=\"attachment_110244\" aria-describedby=\"caption-attachment-110244\" style=\"width: 937px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110244 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/myButton-length-type-error.png\" alt=\"Voorbeeld TypeError met een ongedefinieerd object.\" width=\"937\" height=\"230\"><figcaption id=\"caption-attachment-110244\" class=\"wp-caption-text\">Voorbeeld TypeError met een ongedefinieerd object.<\/figcaption><\/figure>\n<p>In de nieuwere versies van Chrome wordt deze fout echter gerapporteerd als <code>Uncaught TypeError: Cannot read properties of undefined<\/code>. Zo ziet het er nu uit:<\/p>\n<figure id=\"attachment_110247\" aria-describedby=\"caption-attachment-110247\" style=\"width: 1400px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110247 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/length-type-error.png\" alt=\"TypeError voorbeeld met een ongedefinieerd object in nieuwere Chrome versies.\" width=\"1400\" height=\"174\"><figcaption id=\"caption-attachment-110247\" class=\"wp-caption-text\">TypeError voorbeeld met een ongedefinieerd object in nieuwere Chrome versies.<\/figcaption><\/figure>\n<p>De oplossing is opnieuw om ervoor te zorgen dat het object waarvan je de lengte probeert te openen, bestaat en niet is ingesteld op <code>null<\/code>.<\/p>\n<h3>7. TypeError: &#8216;undefined&#8217; is not a function<\/h3>\n<p>Deze fout treedt op wanneer je een methode probeert te callen die niet in je script voorkomt, of wanneer deze wel bestaat, maar waarnaar niet kan worden verwezen in de callende context. Deze fout treedt meestal op in Google Chrome en je kunt deze oplossen door de coderegel te controleren die de fout genereert. Als je een typefout vindt, corrigeer je deze en controleer je of je probleem hiermee is opgelost.<\/p>\n<p>Als jehet zelfverwijzende sleutelwoord <code>this<\/code> in je code hebt gebruikt, kan deze fout optreden als <code>this<\/code> niet op de juiste manier aan je context is gebonden. Beschouw de volgende code:<\/p>\n<pre><code class=\"language-js\">function showAlert() {\n    alert(\"message here\")\n}\n\ndocument.addEventListener(\"click\", () =&gt; {\n    this.showAlert();\n})<\/code><\/pre>\n<p>Als je de bovenstaande code uitvoert, wordt de fout gegenereerd die we hebben besproken. Het gebeurt omdat de anonieme functie die is doorgegeven als de event listener wordt uitgevoerd in de context van het <code>document<\/code>.<\/p>\n<p>Daarentegen is de functie <code>showAlert<\/code> gedefinieerd in de context van de <code>border<\/code>.<\/p>\n<p>Om dit op te lossen, moet je de juiste verwijzing naar de functie doorgeven door deze te binden met de <code>bind()<\/code> methode:<\/p>\n<pre><code class=\"language-js\">document.addEventListener(\"click\", this.showAlert.bind(this))<\/code><\/pre>\n<h3>8. ReferenceError: event is not defined<\/h3>\n<p>Deze fout treedt op wanneer je probeert toegang te krijgen tot een verwijzing die niet is gedefinieerd in het gecallde bereik. Dit gebeurt meestal bij het afhandelen van events, omdat ze je vaak een referentie geven met de naam <code>event<\/code> in de callback functie. Deze fout kan optreden als je vergeet het event argument in de parameters van je functie te defini\u00ebren of als je deze verkeerd spelt.<\/p>\n<p>Deze fout treedt mogelijk niet op in Internet Explorer of Google Chrome (omdat IE een globale event variabele biedt en Chrome de event variabele automatisch aan de handler koppelt), maar het kan voorkomen in Firefox. Het is dus raadzaam om op zulke kleine foutjes te letten.<\/p>\n<h3>9. TypeError: Assignment to constant variable<\/h3>\n<p>Dit is een fout die voortkomt uit onvoorzichtigheid. Als je een nieuwe waarde aan een constante variabele probeert toe te wijzen, krijg je een dergelijk resultaat:<\/p>\n<figure id=\"attachment_110248\" aria-describedby=\"caption-attachment-110248\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110248 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/func-type-error.png\" alt=\"Voorbeeld TypeError met constante objecttoewijzing.\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110248\" class=\"wp-caption-text\">Voorbeeld TypeError met constante objecttoewijzing.<\/figcaption><\/figure>\n<p>Hoewel het nu gemakkelijk lijkt op te lossen, stel je honderden van dergelijke variabele declaraties voor en een ervan is ten onrechte gedefinieerd als <code>const<\/code> in plaats van <code>let<\/code>! <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-vs-javascript\/#variable-and-constant-definitions\">In tegenstelling tot andere scripttalen zoals PHP<\/a>, is er een minimaal verschil tussen de stijl van het declareren van constanten en variabelen in JavaScript. Daarom is het raadzaam om eerst je declaraties te controleren wanneer je met deze fout wordt geconfronteerd. Je kunt deze fout ook tegenkomen als je <em>vergeet<\/em> dat de genoemde verwijzing een constante is en deze als variabele gebruikt. Dit duidt op onzorgvuldigheid of een fout in de logica van je app. Zorg ervoor dat je dit controleert wanneer je dit probleem probeert op te lossen.<\/p>\n<h3>10. (unknown): Script error<\/h3>\n<p>Er treedt een scriptfout op wanneer een extern script een fout naar je browser stuurt. Deze fout wordt gevolgd door <em>(unknown) omdat<\/em> het externe script tot een ander domein dan je app behoort. De browser verbergt andere details om te voorkomen dat gevoelige informatie uit het externe script lekt.<\/p>\n<p>Je kunt deze fout niet oplossen zonder de volledige details te kennen. Je kunt als volgt meer informatie over de fout krijgen:<\/p>\n<ol>\n<li>Voeg het <code>crossorigin<\/code> kenmerk toe aan de scripttag.<\/li>\n<li>Stel de juiste <code>Access-Control-Allow-Origin<\/code> header in op de server waarop het script wordt gehost<\/li>\n<li>[Optioneel] Als je geen toegang hebt tot de server die het script host, kun je overwegen een proxy te gebruiken om je verzoek door te sturen naar de server en terug naar de client met de juiste headers.<\/li>\n<\/ol>\n<p>Zodra je toegang hebt tot de details van de fout, kun je het probleem oplossen, waarschijnlijk met de externe bibliotheek of het netwerk.<\/p>\n<h2>Zo identificeer en voorkom je fouten in JavaScript<\/h2>\n<p>Hoewel de hierboven besproken fouten de meest voorkomende en frequente zijn in JavaScript die je tegen zult komen, kan vertrouwen op een paar voorbeelden nooit genoeg zijn. Het is van vitaal belang om te begrijpen hoe je elk type fout in een JavaScript applicatie kunt detecteren en voorkomen tijdens het ontwikkelen ervan. Dit is hoe je fouten in JavaScript kunt oplossen.<\/p>\n<h3>Handmatig fouten genereren en vangen<\/h3>\n<p>De meest fundamentele manier om fouten af te handelen die handmatig of tijdens runtime zijn gegenereerd, is door ze op te vangen, te catchen. Net als de meeste andere talen biedt JavaScript een reeks trefwoorden om fouten op te lossen. Het is essentieel om elk van hen grondig te kennen voordat je begint met het afhandelen van fouten in je JavaScript app.<\/p>\n<h4>throw<\/h4>\n<p>Het eerste en meest elementaire sleutelwoord van de set is <code>throw<\/code>. Zoals duidelijk is, wordt het throw sleutelwoord gebruikt om fouten te genereren om handmatig uitzonderingen te maken in de JavaScript runtime. We hebben dit al eerder in het stuk besproken, en hier is de kern van de betekenis van dit sleutelwoord:<\/p>\n<ul>\n<li>Je kunt <code>throw<\/code> overal voor gebruiken, inclusief getallen, tekenreeksen en <code>Error<\/code> objecten.<\/li>\n<li>Het is echter niet aan te raden om throw voor primitieve gegevenstypen zoals tekenreeksen en getallen te gebruiken, omdat ze geen foutopsporingsinformatie over de fouten bevatten.<\/li>\n<li>Voorbeeld:\u00a0throw <code>TypeError(\"Please provide a string\")<\/code><\/li>\n<\/ul>\n<h4>try<\/h4>\n<p>Het <code>try<\/code> sleutelwoord wordt gebruikt om aan te geven dat een codeblok een uitzondering kan veroorzaken. De syntaxis is:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ error-prone code here\n}<\/code><\/pre>\n<p>Het is belangrijk op te merken dat een <code>catch<\/code> blok altijd het <code>try<\/code> blok moet volgen om fouten effectief af te handelen.<\/p>\n<h4>catch<\/h4>\n<p>Het <code>catch<\/code> sleutelwoord wordt gebruikt om een <code>catch<\/code> blok te maken. Dit codeblok is verantwoordelijk voor het afhandelen van de fouten die het trailing try blok opvangt. De syntaxis is:<\/p>\n<pre><code class=\"language-js\">catch (exception) {\n    \/\/ code to handle the exception here\n}<\/code><\/pre>\n<p>In tegenstelling tot C++ of Java kun je in JavaScript niet meerdere <code>catch<\/code> blokken aan een <code>try<\/code> blok toevoegen. Dit betekent dat je dit niet kunt doen:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ business logic code\n} catch (exception) {\n    \/\/ error handling code\n}<\/code><\/pre>\n<p>In tegenstelling tot C++ of Java kun je in JavaScript niet meerdere <code>catch<\/code> blokken aan een <code>try<\/code> blok toevoegen. Dit betekent dat je dit niet kunt doen:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ business logic code\n} catch (exception) {\n    if (exception instanceof TypeError) {\n        \/\/ do something\n    }\n} catch (exception) {\n    if (exception instanceof RangeError) {\n    \/\/ do something\n    }\n}<\/code><\/pre>\n<p>In plaats daarvan kun je een <code>if...else<\/code> instructie of een switch case instructie in het enkele catch blok gebruiken om alle mogelijke foutgevallen af te handelen. Het zou er zo uitzien:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ business logic code\n} catch (exception) {\n    if (exception instanceof TypeError) {\n        \/\/ do something\n    } else if (exception instanceof RangeError) {\n        \/\/ do something else\n    }\n}<\/code><\/pre>\n<h4>finally<\/h4>\n<p>Het <code>finally<\/code>\u00a0sleutelwoord wordt gebruikt om een codeblok te defini\u00ebren dat wordt uitgevoerd nadat een fout is afgehandeld. Dit blok wordt uitgevoerd na de try en de catch blokken.<\/p>\n<p>Ook wordt het definitieve blok uitgevoerd, ongeacht het resultaat van de andere twee blokken. Dit betekent dat zelfs als het catch blok de fout niet volledig kan verwerken of als er een fout in het catch blok wordt gegenereerd, de interpreter de code in het laatste blok zal uitvoeren voordat het programma crasht.<\/p>\n<p>Om als geldig te worden beschouwd, moet het try blok in JavaScript worden gevolgd door een catch of een finally blok. Zonder een van deze zal de interpreter een SyntaxError opwerpen. Zorg er daarom voor dat je je try blokken met ten minste een van beide volgt bij het afhandelen van fouten.<\/p>\n<h3>Globaal fouten afhandelen met de onerror() methode<\/h3>\n<p>De <code>onerror()<\/code> methode is beschikbaar voor alle HTML elementen om eventuele fouten af te handelen. Als een <code>img<\/code> tag bijvoorbeeld de afbeelding waarvan de URL is opgegeven niet kan vinden, activeert deze zijn onerror methode zodat de gebruiker de fout kan afhandelen.<\/p>\n<p>Normaal gesproken zou je een andere afbeeldings-URL opgeven in de onerror call waarop de <code>img<\/code> tag kan terugvallen. Zo doe je dat via JavaScript:<\/p>\n<pre><code class=\"language-js\">const image = document.querySelector(\"img\")\n\nimage.onerror = (event) =&gt; {\n    console.log(\"Error occurred: \" + event)\n}<\/code><\/pre>\n<p>Je kunt deze functie echter gebruiken om een globaal foutafhandelingsmechanisme voor je app te maken. Dit is hoe je het kunt doen:<\/p>\n<pre><code class=\"language-js\">window.onerror = (event) =&gt; {\n    console.log(\"Error occurred: \" + event)\n}<\/code><\/pre>\n<p>Met deze eventhandler kun je de meerdere <code>try...catch<\/code> blokken die in je code rondslingeren verwijderen en de foutafhandeling van je app centraliseren, vergelijkbaar met event handling. Je kunt meerdere error handlers aan het venster koppelen om het Single Responsibility Principle van de SOLID ontwerpprincipes te behouden. De interpreter doorloopt alle handlers totdat hij de juiste bereikt.<\/p>\n<h3>Pass Errors via Callbacks<\/h3>\n<p>Hoewel eenvoudige en lineaire functies ervoor zorgen dat foutafhandeling eenvoudig blijft, kunnen callbacks de zaak bemoeilijken.<\/p>\n<p>Kijk eens naar het volgende stukje code:<\/p>\n<pre><code class=\"language-js\">const calculateCube = (number, callback) =&gt; {\n    setTimeout(() =&gt; {\n        const cube = number * number * number\n        callback(cube)\n    }, 1000)\n}\n\nconst callback = result =&gt; console.log(result)\n\ncalculateCube(4, callback)<\/code><\/pre>\n<p>De bovenstaande functie demonstreert een asynchrone condition waarin een functie enige tijd nodig heeft om bewerkingen te verwerken en het resultaat later retourneert met behulp van een callback.<\/p>\n<p>Als je een tekenreeks probeert in te voeren in plaats van 4 in de functieaanroep, krijg je <code>NaN<\/code> als resultaat.<\/p>\n<p>Hier moet goed mee omgegaan worden. Dit is hoe:<\/p>\n<pre><code class=\"language-js\">const calculateCube = (number, callback) =&gt; {\n\n    setTimeout(() =&gt; {\n        if (typeof number !== \"number\")\n            throw new Error(\"Numeric argument is expected\")\n\n        const cube = number * number * number\n        callback(cube)\n    }, 1000)\n}\n\nconst callback = result =&gt; console.log(result)\n\ntry {\n    calculateCube(4, callback)\n} catch (e) { console.log(e) }<\/code><\/pre>\n<p>Dit zou het probleem idealiter moeten oplossen. Als je echter probeert een tekenreeks door te geven aan de functieaanroep, ontvang je dit:<\/p>\n<figure id=\"attachment_110236\" aria-describedby=\"caption-attachment-110236\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110236 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/uncaught-error-numeric-argument.png\" alt=\"Foutvoorbeeld met het verkeerde argument.\" width=\"1100\" height=\"84\"><figcaption id=\"caption-attachment-110236\" class=\"wp-caption-text\">Foutvoorbeeld met het verkeerde argument.<\/figcaption><\/figure>\n<p>Ook al heb je een try-catch blok ge\u00efmplementeerd terwijl je de functie aanroept, het zegt nog steeds dat de fout niet is gevonden. De fout wordt gegenereerd nadat het catch blok is uitgevoerd vanwege de time-outvertraging.<\/p>\n<p>Dit kan snel gebeuren bij netwerk calls, waar onverwachte vertragingen insluipen. Je moet dergelijke gevallen voor zijn tijdens het ontwikkelen van je app.<\/p>\n<p>Zo handel je fouten in callbacks op de juiste manier af:<\/p>\n<pre><code class=\"language-js\">const calculateCube = (number, callback) =&gt; {\n\n    setTimeout(() =&gt; {\n        if (typeof number !== \"number\") {\n            callback(new TypeError(\"Numeric argument is expected\"))\n            return\n        }\n        const cube = number * number * number\n        callback(null, cube)\n    }, 2000)\n}\n\nconst callback = (error, result) =&gt; {\n    if (error !== null) {\n        console.log(error)\n        return\n    }\n    console.log(result)\n}\n\ntry {\n    calculateCube('hey', callback)\n} catch (e) {\n    console.log(e)\n}<\/code><\/pre>\n<p>Nu zal de output op de console zijn:<\/p>\n<figure id=\"attachment_110238\" aria-describedby=\"caption-attachment-110238\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110238 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/type-error-numeric-dark.png\" alt=\"TypeError voorbeeld met ongeldig argument.\" width=\"1100\" height=\"84\"><figcaption id=\"caption-attachment-110238\" class=\"wp-caption-text\">TypeError voorbeeld met ongeldig argument.<\/figcaption><\/figure>\n<p>Dit geeft aan dat de fout op de juiste manier is afgehandeld.<\/p>\n<h3>Omgaan met fouten in promises<\/h3>\n<p>De meeste mensen geven de voorkeur aan promises voor het afhandelen van asynchrone activiteiten. Promises hebben nog een ander voordeel: een afgewezen promise be\u00ebindigt je script niet. Je moet echter nog steeds een catch blok implementeren om fouten in promises af \u200b\u200bte handelen. Laten we, om dit beter te begrijpen, de <code>calculateCube()<\/code>functie herschrijven met promises:<\/p>\n<pre><code class=\"language-js\">const delay = ms =&gt; new Promise(res =&gt; setTimeout(res, ms));\n\nconst calculateCube = async (number) =&gt; {\n    if (typeof number !== \"number\")\n        throw Error(\"Numeric argument is expected\")\n    await delay(5000)\n    const cube = number * number * number\n    return cube\n}\n\ntry {\n    calculateCube(4).then(r =&gt; console.log(r))\n} catch (e) { console.log(e) }<\/code><\/pre>\n<p>De time-out van de vorige code is ge\u00efsoleerd in de <code>delay<\/code> voor beter begrip. Als je een tekenreeks probeert in te voeren in plaats van 4, zal de output die je krijgt er ongeveer zo uitzien:<\/p>\n<figure id=\"attachment_110235\" aria-describedby=\"caption-attachment-110235\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110235 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/uncaught-error-numeric.png\" alt=\"TypeError voorbeeld met een ongeldig argument in Promise.\" width=\"1100\" height=\"100\"><figcaption id=\"caption-attachment-110235\" class=\"wp-caption-text\">TypeError voorbeeld met een ongeldig argument in Promise.<\/figcaption><\/figure>\n<p>Nogmaals, dit komt doordat de <code>Promise<\/code> de fout genereert nadat al het andere de uitvoering heeft voltooid. De oplossing voor dit probleem is eenvoudig. Voeg eenvoudig een <code>catch()<\/code> aanroep toe aan de promise chain, als volgt:<\/p>\n<pre><code class=\"language-js\">calculateCube(\"hey\")\n.then(r =&gt; console.log(r))\n.catch(e =&gt; console.log(e))<\/code><\/pre>\n<p>Nu zal de output zijn:<\/p>\n<figure id=\"attachment_110242\" aria-describedby=\"caption-attachment-110242\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110242 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/numeric-argument-error.png\" alt=\"TypeError voorbeeld afgehandeld met ongeldig argument.\" width=\"1100\" height=\"100\"><figcaption id=\"caption-attachment-110242\" class=\"wp-caption-text\">TypeError voorbeeld afgehandeld met ongeldig argument.<\/figcaption><\/figure>\n<p>Je kunt zien hoe gemakkelijk het is om fouten met promises af te handelen. Bovendien kun je een blok <code>finally()<\/code> en de promise call koppelen om code toe te voegen die wordt uitgevoerd nadat de foutafhandeling is voltooid.<\/p>\n<p>Als alternatief kun je ook fouten in promises afhandelen met behulp van de traditionele try-catch-finally techniek. Zo ziet je promise call er in dat geval uit:<\/p>\n<pre><code class=\"language-js\">try {\n    let result = await calculateCube(\"hey\")\n    console.log(result)\n} catch (e) {\n    console.log(e)\n} finally {\n    console.log('Finally executed\")\n}<\/code><\/pre>\n<p>Dit werkt echter alleen binnen een asynchrone functie. Daarom is de meest geprefereerde manier om fouten in beloften aan te pakken, de <code>catch<\/code> en <code>finally<\/code> aan de promise aanroep te hangen.<\/p>\n<h3>throw\/catch vs onerror() vs callbacks vs promises: welke is het beste?<\/h3>\n<p>Met vier methoden tot je beschikking, moet je weten hoe je de meest geschikte in een bepaalde gebruikssituatie kunt kiezen. Zo kun je zelf beslissen:<\/p>\n<h4>throw\/catch<\/h4>\n<p>Je zult deze methode het grootste deel van de tijd gebruiken. Zorg ervoor dat je voorwaarden voor alle mogelijke fouten in je catch blok implementeert, en vergeet niet om een definitief blok op te nemen als je na het try blok wat opruimingsroutines binnen je geheugen moet uitvoeren.<\/p>\n<p>Te veel try\/catch blokken kunnen je code echter moeilijk te onderhouden maken. Als je je in een dergelijke situatie bevindt, wil je misschien fouten afhandelen via de global handler of de promise methode.<\/p>\n<p>Bij het kiezen tussen asynchrone try\/catch blokken en promise&#8217;s <code>catch()<\/code>, is het raadzaam om de asynchrone try\/catch blokken te gebruiken, omdat ze je code lineair en gemakkelijk te debuggen maken.<\/p>\n<h4>onerror()<\/h4>\n<p>Het is het beste om de <code>onerror()<\/code> methode te gebruiken als je weet dat je app veel fouten moet afhandelen, en ze kunnen flink verspreid zijn over de codebase. Met de <code>onerror<\/code> methode kun je fouten afhandelen alsof het simpelweg een ander event is die door je applicatie wordt afgehandeld. Je kunt meerdere error handlers defini\u00ebren en deze bij de eerste rendering aan het venster van je app koppelen.<\/p>\n<p>Je moet echter ook onthouden dat de <code>onerror()<\/code> methode een onnodige uitdaging kan zijn om op te zetten in kleinere projecten met een kleinere foutenmarge. Als je zeker weet dat je app niet te veel fouten genereert, werkt de traditionele throw\/catch methode het beste voor jou.<\/p>\n<h4>Callbacks en promises<\/h4>\n<p>Foutafhandeling bij callbacks en promises verschilt vanwege hun codeontwerp en -structuur. Als je echter tussen deze twee kiest voordat je je code hebt geschreven, kun je het beste met promises werken.<\/p>\n<p>Dit komt omdat promises een ingebouwde constructie hebben voor het koppelen van een <code>catch()<\/code> en een <code>finally()<\/code> blok om fouten makkelijk af te handelen. Deze methode is eenvoudiger en schoner dan het defini\u00ebren van aanvullende argumenten\/het hergebruiken van bestaande argumenten om fouten af te handelen.<\/p>\n<h3>Houd wijzigingen bij met Git opslagplaatsen<\/h3>\n<p>Veel fouten ontstaan vaak door handmatige fouten in de codebase. Tijdens het ontwikkelen of debuggen van je code, kan het zijn dat je onnodige wijzigingen aanbrengt die ertoe kunnen leiden dat er nieuwe fouten in je codebase verschijnen. <a href=\"https:\/\/kinsta.com\/nl\/docs\/wordpress-hosting\/wordpress-referentie\/technische-faq\/\">Geautomatiseerd testen<\/a> is een geweldige manier om je code na elke wijziging te tracken. Het kan je echter alleen vertellen of er iets mis is. Als je niet regelmatig een backup van je code maakt, verspil je tijd aan het repareren van een functie of een script dat voorheen prima werkte.<\/p>\n<p>Dit is waar git een rol speelt. Met een juiste commit strategie kun je je git geschiedenis gebruiken als een backupsysteem om je code te bekijken terwijl deze zich tijdens de ontwikkeling heeft ge\u00ebvolueerd. Je kunt makkelijk door je oudere commits bladeren en erachter komen dat de versie van de functie voorheen goed werkte, maar fouten genereert na een niet-gerelateerde wijziging.<\/p>\n<p>Je kunt dan de oude code herstellen of de twee versies vergelijken om te bepalen wat er mis is gegaan. Moderne <a href=\"https:\/\/kinsta.com\/nl\/blog\/webdevelopment-tools\/\">webontwikkelingstools<\/a> zoals <a href=\"https:\/\/kinsta.com\/blog\/what-is-github\/\">GitHub<\/a> Desktop of GitKraken helpen je om deze veranderingen naast elkaar te visualiseren en de fouten snel te achterhalen.<\/p>\n<p>Een gewoonte die je kan helpen minder fouten te maken, is het uitvoeren van <a href=\"https:\/\/kinsta.com\/nl\/blog\/code-review-tools\/\">code reviews<\/a> wanneer je een belangrijke wijziging in je code aanbrengt. Als je in een team werkt, kun je een pull verzoek maken en een teamlid dit grondig laten beoordelen. Dit zal je helpen een tweede paar ogen te gebruiken om eventuele fouten op te sporen die je mogelijk zijn ontgaan.<\/p>\n<h2>Best practices voor het afhandelen van fouten in JavaScript<\/h2>\n<p>De bovengenoemde methoden zijn geschikt om je te helpen bij het ontwerpen van een solide aanpak voor foutafhandeling voor je volgende JavaScript applicatie. Het is echter het beste om een paar dingen in gedachten te houden terwijl je ze implementeert om het beste uit je foutbestendigheid te halen. Hier zijn enkele tips om je te helpen.<\/p>\n<h3>1. Gebruik custom errors bij het afhandelen van operationele uitzonderingen<\/h3>\n<p>We hebben aan het begin van deze handleiding custom errors ge\u00efntroduceerd om je een idee te geven van hoe je de foutafhandeling kunt aanpassen aan het unieke geval van jouw applicatie. Het is raadzaam om waar mogelijk custom errors fouten te gebruiken in plaats van de generieke <code>Error<\/code> klasse, omdat deze de callende omgeving meer contextuele informatie geeft over de fout.<\/p>\n<p>Bovendien kun je met customers errors controleren hoe een fout wordt weergegeven in de aanroepende omgeving. Dit betekent dat je ervoor kunt kiezen om specifieke details te verbergen of aanvullende informatie over de fout weer te geven wanneer je maar wilt.<\/p>\n<p>Je kunt zo ver gaan dat je de content van de fout opmaakt volgens jouw behoeften. Dit geeft je betere controle over hoe de fout wordt ge\u00efnterpreteerd en afgehandeld.<\/p>\n<h3>2. \u201cSwallow\u201d je uitzonderingen niet!<\/h3>\n<p>Zelfs de meest ervaren ontwikkelaars maken vaak een beginnersfout: ze gebruiken uitzonderingsniveaus diep in hun code.<\/p>\n<p>Je kunt situaties tegenkomen waarin je een stukje code hebt dat optioneel is om uit te kunnen voeren. Als het werkt, geweldig; als dat niet het geval is, hoef je er niets aan te doen.<\/p>\n<p>In deze gevallen is het vaak verleidelijk om deze code in een try blok te plaatsen en er een leeg catch blok aan te koppelen. Door dit te doen, laat je dat stukje code echter openstaan \u200b\u200bom <em>elke<\/em> vorm van fout te veroorzaken en ermee weg te komen. Dit kan gevaarlijk worden als je een grote codebase hebt en veel voorbeelden van dergelijke slechte constructies voor foutbeheer.<\/p>\n<p>De beste manier om met uitzonderingen om te gaan, is door een niveau te bepalen waarop ze allemaal worden gedeeld en ze te verhogen totdat ze daar zijn. Dit niveau kan een controller zijn (in een MVC architectuur app) of een middleware (in een traditionele servergerichte app).<\/p>\n<p>Op deze manier kom je te weten waar je alle fouten in je app kunt vinden en kun je kiezen hoe je ze oplost, zelfs als dat betekent dat je er niets aan hoeft te doen.<\/p>\n<h3>3. Gebruik een gecentraliseerde strategie voor logboeken en foutwaarschuwingen<\/h3>\n<p>Het loggen van een fout is vaak een integraal onderdeel van de afhandeling ervan. Degenen die er niet in slagen om een gecentraliseerde strategie voor het loggen van fouten te ontwikkelen, kunnen waardevolle informatie over het gebruik van hun app mislopen.<\/p>\n<p>De eventlogboeken van een app kunnen je helpen cruciale gegevens over fouten te achterhalen en deze snel te debuggen. Als je de juiste waarschuwingsmechanismen in je app hebt ingesteld, kun je weten wanneer er een fout optreedt in je app voordat deze een groot deel van je gebruikersbestand bereikt.<\/p>\n<p>Het is raadzaam om een vooraf gebouwde logger te gebruiken of er een te maken die aan jouw behoeften voldoet. Je kunt deze logger configureren om fouten af te handelen op basis van hun niveaus (waarschuwing, foutopsporing, info, enz.), en sommige loggers gaan zelfs zo ver dat logbestanden onmiddellijk naar externe logservers worden verzonden. Op deze manier kun je zien hoe de logica van je applicatie presteert bij actieve gebruikers.<\/p>\n<h3>4. Breng gebruikers op de juiste manier op de hoogte van fouten<\/h3>\n<p>Een ander goed punt om in gedachten te houden bij het defini\u00ebren van je foutafhandelingsstrategie is om de gebruiker in gedachten te houden.<\/p>\n<p>Alle fouten die de normale werking van je app verstoren, moeten een zichtbare waarschuwing aan de gebruiker geven om hen op de hoogte te stellen dat er iets mis is gegaan, zodat de gebruiker kan proberen een oplossing te vinden. Als je een snelle oplossing voor de fout weet, zoals het opnieuw proberen van een bewerking of uitloggen en opnieuw inloggen, moet je dit in de waarschuwing vermelden om de gebruikerservaring in realtime te verbeteren.<\/p>\n<p>In het geval van fouten die geen interferentie veroorzaken met de dagelijkse gebruikerservaring, kun je overwegen de waarschuwing te onderdrukken en de fout op een externe server te loggen om later op te lossen.<\/p>\n<h3>5. Implementeer een middleware (Node.js)<\/h3>\n<p>De <a href=\"https:\/\/kinsta.com\/nl\/blog\/wat-is-node-js\/\">Node.js omgeving<\/a> ondersteunt middlewares om functionaliteiten toe te voegen aan serverapplicaties. Je kunt deze feature gebruiken om een middleware voor foutafhandeling voor je server te maken.<\/p>\n<p>Het belangrijkste voordeel van het gebruik van middleware is dat al je fouten centraal op \u00e9\u00e9n plek worden afgehandeld. Je kunt ervoor kiezen om deze configuratie eenvoudig in of uit te schakelen voor testdoeleinden.<\/p>\n<p>Zo maak je een basic middleware:<\/p>\n<pre><code class=\"language-js\">const logError = err =&gt; {\n    console.log(\"ERROR: \" + String(err))\n}\n\nconst errorLoggerMiddleware = (err, req, res, next) =&gt; {\n    logError(err)\n    next(err)\n}\n\nconst returnErrorMiddleware = (err, req, res, next) =&gt; {\n    res.status(err.statusCode || 500)\n       .send(err.message)\n}\n\nmodule.exports = {\n    logError,\n    errorLoggerMiddleware,\n    returnErrorMiddleware\n}<\/code><\/pre>\n<p>Je kunt deze middleware dan als volgt in je app gebruiken:<\/p>\n<pre><code class=\"language-js\">const { errorLoggerMiddleware, returnErrorMiddleware } = require('.\/errorMiddleware')\n\napp.use(errorLoggerMiddleware)\n\napp.use(returnErrorMiddleware)<\/code><\/pre>\n<p>Je kunt nu aangepaste logica binnen de middleware defini\u00ebren om fouten op de juiste manier af te handelen. Je hoeft zich geen zorgen meer te maken over het implementeren van individuele foutafhandelingsconstructies in je codebase.<\/p>\n<h3>6. Start je app opnieuw om programmeerfouten op te lossen (Node.js)<\/h3>\n<p>Wanneer Node.js apps programmeerfouten tegenkomen, hoeven ze niet per se een uitzondering te genereren en proberen ze de app te sluiten. Dergelijke fouten kunnen problemen omvatten die voortkomen uit programmeerfouten, zoals een hoog CPU verbruik, geheugen bloating of geheugenlekken. De beste manier om hiermee om te gaan, is door de app opnieuw te starten door hem te laten crashen via de Node.js clustermodus of een unieke tool zoals PM2. Dit kan ervoor zorgen dat de app niet crasht bij actie van de gebruiker, wat een vreselijke gebruikerservaring oplevert.<\/p>\n<h3>7. Catch alle niet-gecatchte uitzonderingen (Node.js)<\/h3>\n<p>Je kunt er nooit zeker van zijn dat je alle mogelijke fouten die in je app kunnen optreden, hebt opgevangen. Daarom is het essentieel om een fallback strategie te implementeren om alle niet-gecatchte uitzonderingen van je app op te vangen.<\/p>\n<p>Zo kun je dat doen:<\/p>\n<pre><code class=\"language-js\">process.on('uncaughtException', error =&gt; {\n    console.log(\"ERROR: \" + String(error))\n    \/\/ other handling mechanisms\n})<\/code><\/pre>\n<p>Je kunt ook vaststellen of de opgetreden fout een standaarduitzondering is of een aangepaste operationele fout. Op basis van het resultaat kun je het proces afsluiten en opnieuw starten om onverwacht gedrag te voorkomen.<\/p>\n<h3>8. Catch alle onverwerkte promise rejections (Node.js)<\/h3>\n<p>Net zoals je nooit alle mogelijke uitzonderingen kunt dekken, is de kans groot dat je mogelijke promise rejections misloopt. In tegenstelling tot uitzonderingen, genereren promise rejections echter geen fouten.<\/p>\n<p>Dus mocht een belangrijke promise een rejection krijgen, dan is de kans aanwezig dat je geen waarschuwing zal zien, waardoor de kans bestaat dat je later onverwacht gedrag tegenkomt. Daarom is het van cruciaal belang om een fallback mechanisme te implementeren voor het afhandelen van de promise rejection.<\/p>\n<p>Zo kun je dat doen:<\/p>\n<pre><code class=\"language-js\">const promiseRejectionCallback = error =&gt; {\n    console.log(\"PROMISE REJECTED: \" + String(error))\n}\n\nprocess.on('unhandledRejection', callback)<\/code><\/pre>\n\n<h2>Samenvatting<\/h2>\n<p>Net als elke andere programmeertaal komen fouten vrij vaak en natuurlijk voor in JavaScript. In sommige gevallen moet je zelfs opzettelijk fouten genereren om de juiste reactie aan je gebruikers aan te geven. Daarom is het van cruciaal belang om hun anatomie en soorten te begrijpen.<\/p>\n<p>Bovendien moet je uitgerust zijn met de juiste tools en technieken om fouten te identificeren en te voorkomen dat je applicatie onbruikbaar wordt.<\/p>\n<p>In de meeste gevallen is een solide strategie om fouten met zorgvuldige uitvoering af te handelen voldoende voor alle soorten JavaScript applicaties.<\/p>\n<p><em>Zijn er nog andere JavaScript fouten die je nog steeds niet hebt kunnen oplossen? Zijn er technieken om constructief met JS fouten om te gaan? Laat het ons weten in de comments hieronder!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Murphy&#8217;s wet stelt dat alles wat fout kan gaan uiteindelijk fout een keer zal gaan. Helaas is de programmeerwereld een van de plekken waar deze wet &#8230;<\/p>\n","protected":false},"author":238,"featured_media":41945,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[384,431,29],"topic":[913],"class_list":["post-41944","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-development","tag-javascript","tag-webdev","topic-javascript-fouten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>De definitieve handleiding voor het omgaan met fouten in JavaScript<\/title>\n<meta name=\"description\" content=\"Loop je steeds tegen fouten in je JavaScript aan? We laten je zien hoe je deze fouten de baas blijft zodat je snel verder kan gaan met het ontwikkelen van je project.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"De definitieve handleiding voor het omgaan met fouten in JavaScript\" \/>\n<meta property=\"og:description\" content=\"Loop je steeds tegen fouten in je JavaScript aan? We laten je zien hoe je deze fouten de baas blijft zodat je snel verder kan gaan met het ontwikkelen van je project.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-02-10T10:41:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-06T09:03:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/02\/errors-in-javascript.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Kumar Harsh\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Loop je steeds tegen fouten in je JavaScript aan? We laten je zien hoe je deze fouten de baas blijft zodat je snel verder kan gaan met het ontwikkelen van je project.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/02\/errors-in-javascript.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kumar Harsh\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"35 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/\"},\"author\":{\"name\":\"Kumar Harsh\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\"},\"headline\":\"De definitieve handleiding voor het omgaan met fouten in JavaScript\",\"datePublished\":\"2022-02-10T10:41:09+00:00\",\"dateModified\":\"2023-07-06T09:03:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/\"},\"wordCount\":6408,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/02\/errors-in-javascript.jpg\",\"keywords\":[\"development\",\"JavaScript\",\"webdev\"],\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/\",\"name\":\"De definitieve handleiding voor het omgaan met fouten in JavaScript\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/02\/errors-in-javascript.jpg\",\"datePublished\":\"2022-02-10T10:41:09+00:00\",\"dateModified\":\"2023-07-06T09:03:31+00:00\",\"description\":\"Loop je steeds tegen fouten in je JavaScript aan? We laten je zien hoe je deze fouten de baas blijft zodat je snel verder kan gaan met het ontwikkelen van je project.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/02\/errors-in-javascript.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/02\/errors-in-javascript.jpg\",\"width\":1460,\"height\":730,\"caption\":\"De definitieve handleiding voor het omgaan met fouten in JavaScript\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/nl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript fouten\",\"item\":\"https:\/\/kinsta.com\/nl\/onderwerpen\/javascript-fouten\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"De definitieve handleiding voor het omgaan met fouten in JavaScript\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/nl\/#website\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snelle, veilige, premium hostingoplossingen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/nl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\",\"https:\/\/x.com\/Kinsta_NL\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\",\"name\":\"Kumar Harsh\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g\",\"caption\":\"Kumar Harsh\"},\"description\":\"Kumar is a software developer and a technical author based in India. He specializes in JavaScript and DevOps. You can learn more about his work on his website.\",\"sameAs\":[\"https:\/\/kumarharsh.me\"],\"url\":\"https:\/\/kinsta.com\/nl\/blog\/author\/kumarharsh\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"De definitieve handleiding voor het omgaan met fouten in JavaScript","description":"Loop je steeds tegen fouten in je JavaScript aan? We laten je zien hoe je deze fouten de baas blijft zodat je snel verder kan gaan met het ontwikkelen van je project.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/","og_locale":"nl_NL","og_type":"article","og_title":"De definitieve handleiding voor het omgaan met fouten in JavaScript","og_description":"Loop je steeds tegen fouten in je JavaScript aan? We laten je zien hoe je deze fouten de baas blijft zodat je snel verder kan gaan met het ontwikkelen van je project.","og_url":"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","article_published_time":"2022-02-10T10:41:09+00:00","article_modified_time":"2023-07-06T09:03:31+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/02\/errors-in-javascript.jpg","type":"image\/jpeg"}],"author":"Kumar Harsh","twitter_card":"summary_large_image","twitter_description":"Loop je steeds tegen fouten in je JavaScript aan? We laten je zien hoe je deze fouten de baas blijft zodat je snel verder kan gaan met het ontwikkelen van je project.","twitter_image":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/02\/errors-in-javascript.jpg","twitter_creator":"@Kinsta_NL","twitter_site":"@Kinsta_NL","twitter_misc":{"Geschreven door":"Kumar Harsh","Geschatte leestijd":"35 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/"},"author":{"name":"Kumar Harsh","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9"},"headline":"De definitieve handleiding voor het omgaan met fouten in JavaScript","datePublished":"2022-02-10T10:41:09+00:00","dateModified":"2023-07-06T09:03:31+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/"},"wordCount":6408,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/02\/errors-in-javascript.jpg","keywords":["development","JavaScript","webdev"],"inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/","url":"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/","name":"De definitieve handleiding voor het omgaan met fouten in JavaScript","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/02\/errors-in-javascript.jpg","datePublished":"2022-02-10T10:41:09+00:00","dateModified":"2023-07-06T09:03:31+00:00","description":"Loop je steeds tegen fouten in je JavaScript aan? We laten je zien hoe je deze fouten de baas blijft zodat je snel verder kan gaan met het ontwikkelen van je project.","breadcrumb":{"@id":"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#primaryimage","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/02\/errors-in-javascript.jpg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2022\/02\/errors-in-javascript.jpg","width":1460,"height":730,"caption":"De definitieve handleiding voor het omgaan met fouten in JavaScript"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/nl\/blog\/fouten-in-javascript\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/nl\/"},{"@type":"ListItem","position":2,"name":"JavaScript fouten","item":"https:\/\/kinsta.com\/nl\/onderwerpen\/javascript-fouten\/"},{"@type":"ListItem","position":3,"name":"De definitieve handleiding voor het omgaan met fouten in JavaScript"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/nl\/#website","url":"https:\/\/kinsta.com\/nl\/","name":"Kinsta\u00ae","description":"Snelle, veilige, premium hostingoplossingen","publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/nl\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","https:\/\/x.com\/Kinsta_NL","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9","name":"Kumar Harsh","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g","caption":"Kumar Harsh"},"description":"Kumar is a software developer and a technical author based in India. He specializes in JavaScript and DevOps. You can learn more about his work on his website.","sameAs":["https:\/\/kumarharsh.me"],"url":"https:\/\/kinsta.com\/nl\/blog\/author\/kumarharsh\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/41944","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/users\/238"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/comments?post=41944"}],"version-history":[{"count":6,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/41944\/revisions"}],"predecessor-version":[{"id":53806,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/41944\/revisions\/53806"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/41944\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/41944\/translations\/it"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/41944\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/41944\/translations\/de"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/41944\/translations\/pt"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/41944\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/41944\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/41944\/translations\/jp"},{"href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/41944\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media\/41945"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media?parent=41944"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/tags?post=41944"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/topic?post=41944"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}