WebOntwikkeling 2024
DigitAP
  • Introductie
  • Tooling
    • Devcontainers
    • Git
    • Terminal en bash
  • NodeJS + TypeScript
    • Wat is NodeJS?
    • Waarom TypeScript?
    • Nieuw project
    • Input lezen
    • Type Systeem
      • Basic types
      • Arrays
      • Interfaces
      • Functions
    • Exceptions
    • Modules
    • Asynchroon Programmeren
      • Promises
      • Async/Await
      • Fetch
      • Extra voorbeelden
  • Express.js
    • Wat is een backend framework?
    • Basis
    • Nodemon
    • Statische Bestanden
    • EJS
    • Request
      • GET Request
      • POST Request
      • Multi-part form data
    • Response
    • Router
    • Middleware
    • Deployment
  • MongoDB
    • Wat is MongoDB?
    • MongoDB driver
    • Insert
    • Find
    • Limit & Sort
    • Query Operators
    • Update
    • Delete
    • Text Search
    • Gebruik in Express.js
      • CRUD
  • Security & Testing
    • Environment Variables
    • Cookies
    • Hashing & Encryptie
    • Sessions
      • Session Based Login
    • JWT Tokens
      • JWT NPM package
      • Tokens veilig opslaan
      • Token Based Login
    • Testing
  • Labos
    • 1. Tooling
    • 2. Basis
      • Hello Name
      • BMI Calculator
      • BMI Calculator Multi
      • Interest Calculator
      • Uren en Minuten
      • Wisselgeld
      • Name from Email
      • Text Box
    • 3. Arrays
      • Som van getallen
      • Puntenboek
      • Rot13
      • Pokemon Team
      • Todo List String
      • Tick Tac Toe
    • 4. Interfaces & functies
      • Interfaces
        • Recepten
        • Movies Objects
        • Todo List Objects
      • Functies
        • Math Fun
        • Short Notation
        • Array Sum
        • Movies Functions
        • Filter Numbers
        • At Least Two
    • 5. Async & fetch
      • Fake Fetch
      • Promise All
      • Slow Sum
      • Todo List Fetch
      • Cocktails Promise All
      • Bitcoin API
      • Joke API
      • School API
      • Cocktails API
      • Unix Timestamp API
    • 6. Modules en NPM Packages
      • Math Module
      • Export Interfaces
      • Cowsay Module
      • Cat GPT
      • Rainbow Chalk
    • 7. Express
      • Hello Express
      • DadJoke Express
      • Bitcoin current
    • 8. EJS + Static
      • Hello Express EJS
      • Cat Static
      • Maaltafels
      • Newspaper
    • 9. Get Request
      • Hello Query
      • Math Service
      • Newspaper Route
      • Newspaper Search
      • Steam
    • 10. Post Request
      • Pet Shelter
      • Redirect Form
      • Contact Form
    • 11. Router en Middleware
      • Router Combi
      • Utility Middleware
      • Rate Limiter
    • 12. Herhaling
      • Twitter
      • Word Guess
    • 13. Mongo Basics
      • Guestbook
      • MoviesDB
      • Pokemon Team
    • 14. Mongo Queries
      • Pet Shelter
      • Games DB
    • 15. Mongo + Express
      • Pet Shelter Express
      • Guestbook Express
      • Pokemon Team Express
    • 16. CRUD
      • Users CRUD
      • Pokedex
    • 17. Session & Cookies
      • Shopping Cookie
      • View Counter Cookies
      • View Counter Sessions
    • 18. Session based login
      • Login Express
      • Pokedex Express Sessions
    • 19. Token based login
      • JWT Sign
      • Login Express JWT
    • 20. Testing
      • Math Test
      • String Test
      • Math Express Test
      • Form Express Test
      • Pet Shelter Express Test
    • 21. Herhaling
      • Youtube Favorites
      • Beerster
    • Extra oefeningen
      • DNA Match
      • View Counter
      • Hogwarts Express CRUD
  • Project
    • Voorbereiding (devcontainer + github)
    • Semester 2
      • Milestone 1 - Terminal App
      • Milestone 2 - Express
      • Milestone 3 - MongoDB
      • Milestone 4 - Security
Powered by GitBook
On this page
  • Throw
  • Try catch
  • Finally
  • Error object
Export as PDF
  1. NodeJS + TypeScript

Exceptions

Throw

Soms kan het gebeuren dat er een fout optreedt tijdens het uitvoeren van je programma. Dit kan bijvoorbeeld gebeuren als je een bestand wil openen dat niet bestaat. In dit geval zal je programma crashen of vreemd gedrag beginnen vertonen. Bijvoorbeeld als je een functie wil schrijven voor het delen van twee getallen. Als je de functie aanroept met een deler die gelijk is aan 0, dan zal de functie een foutmelding moeten geven.

function divide(a: number, b: number): number {
    return a / b;
}

console.log(divide(5, 0)); // Output: Infinity

In dit geval krijg je geen foutmelding maar een vreemd resultaat, je krijgt Infinity als resultaat. Dit is niet wat we willen. We willen dat de functie een foutmelding geeft als de deler gelijk is aan 0. Dit kunnen we doen aan de hand van een if statement en de throw statement.

function divide(a: number, b: number): number {
    if (b == 0) {
        throw new Error("Division by zero is not allowed");
    }
    return a / b;
}

console.log(divide(5, 0)); // Error: Division by zero is not allowed

Let nu wel op dat je de functie niet meer kan gebruiken zoals hieronder. Als je de functie aanroept met een deler die gelijk is aan 0 dan zal de functie een foutmelding geven en zal je programma stoppen met uitvoeren (en dus "crashen").

Try catch

Willen we nu deze foutmelding opvangen en zelf een foutmelding geven aan de gebruiker dan kunnen we dit doen aan de hand van een try catch statement. We kunnen de functie aanroepen in een try block en de foutmelding opvangen in een catch block. In het catch block kunnen we dan zelf een foutmelding geven aan de gebruiker.

try {
    console.log(divide(5, 0));
} catch (error) {
    console.log("Je kan niet delen door 0");
}

Natuurlijk is dit een beetje een nutteloos voorbeeld, want je weet op voorhand dat deze functie een fout zal geven omdat je zelf als programmeur de deler op 0 hebt gezet. Maar als je de twee getallen afhankelijk maakt van de input van een gebruiker dan kan je niet op voorhand weten of de deler gelijk zal zijn aan 0. In dat geval kan je de foutmelding opvangen en zelf een foutmelding geven aan de gebruiker en opnieuw vragen naar de input.

import * as readline from 'readline-sync';

function divide(a: number, b: number): number {
    if (b == 0) {
        throw new Error("Division by zero is not allowed");
    }
    return a / b;
}

let result : number | undefined = undefined;

while (result == undefined) {
    let a = readline.questionInt("Geef een getal: ");
    let b = readline.questionInt("Geef een getal: ");
    try {
        result = divide(a, b);
    } catch (error) {
        console.log("Je kan niet delen door 0");
    }
}

console.log("Het resultaat is " + result);

Finally

Je kan ook een finally block toevoegen aan je try catch statement. Dit block zal altijd uitgevoerd worden, ook als er geen foutmelding is opgetreden. Dit kan handig zijn als je bijvoorbeeld een bestand hebt geopend en je wil dit bestand altijd sluiten, ook als er een foutmelding is opgetreden. Dus bijvoorbeeld:

try {
    console.log(divide(5, 0));
} catch (error) {
    console.log("Je kan niet delen door 0");
} finally {
    console.log("Dit print altijd");
}

Met het bovenstaande voorbeeld krijg je de volgende output:

Je kan niet delen door 0
Dit print altijd

Error object

Als je een foutmelding opvangt in een catch block dan kan je deze foutmelding gebruiken in je code. Tot nu toe hebben we altijd een nieuw Error object aangemaakt en zelf een foutmelding gegeven. Maar je kan ook de foutmelding die je opvangt gebruiken. Dit is een object met een aantal properties die je kan gebruiken. Zo heeft dit object een message property die de foutmelding bevat. Je kan deze property gebruiken om de foutmelding te tonen aan de gebruiker. Let er op dat je hier het type unknown (of any) moet gebruiken omdat je niet weet welk type de foutmelding zal hebben.

try {
    console.log(divide(5, 0));
} catch (error : any) {
    console.log(error.message);
}
try {
    console.log(divide(5, 0));
} catch (error : unknown) {
    if (error instanceof Error) {
        console.log(error.message);
    }
}

Dit zal de volgende output geven:

Division by zero is not allowed

In principe is het ook mogelijk om een foutmelding op te gooien zonder een Error object te gebruiken. Je kan bijvoorbeeld een string opgooien als foutmelding.

function divide(a: number, b: number): number {
    if (b == 0) {
        throw "Division by zero is not allowed";
    }
    return a / b;
}

Dan kan je uiteraard wel niet meer gebruik maken van de message property van het Error object.

PreviousFunctionsNextModules

Last updated 2 months ago