Chapitre 9 : Asynchronisme (Promises, Fetch)

Écouter la leçon Lecture audio assistée par IA

1. Introduction

La gestion des erreurs permet de gérer les situations imprévues sans faire planter l'application.

2. try / catch / finally

Syntaxe de base

try {
    // Code susceptible de générer une erreur
    let resultat = riskyFunction();
} catch (error) {
    // Gestion de l'erreur
    console.error("Erreur:", error.message);
} finally {
    // Toujours exécuté
    console.log("Nettoyage");
}

Exemple concret

try {
    let data = JSON.parse('{"nom": "Alice"}');
    console.log(data.nom); // "Alice"
} catch (error) {
    console.error("Erreur de parsing:", error);
}

try {
    let invalid = JSON.parse('{invalid json}');
} catch (error) {
    console.error("JSON invalide:", error.message);
}

3. L'instruction throw

Permet de lancer une erreur personnalisée :

function diviser(a, b) {
    if (b === 0) {
        throw new Error("Division par zéro impossible");
    }
    return a / b;
}

try {
    let resultat = diviser(10, 0);
} catch (error) {
    console.error(error.message); // "Division par zéro impossible"
}

4. Types d'erreurs

Error (erreur générique)

throw new Error("Quelque chose s'est mal passé");

TypeError

let x = null;
try {
    x.toUpperCase(); // TypeError
} catch (error) {
    console.log(error.name); // "TypeError"
}

ReferenceError

try {
    console.log(variableInexistante); // ReferenceError
} catch (error) {
    console.log(error.name); // "ReferenceError"
}

SyntaxError

try {
    eval('let x = ;'); // SyntaxError
} catch (error) {
    console.log(error.name); // "SyntaxError"
}

5. Erreurs personnalisées

class ValidationError extends Error {
    constructor(message) {
        super(message);
        this.name = "ValidationError";
    }
}

function validerAge(age) {
    if (age < 0) {
        throw new ValidationError("L'âge ne peut pas être négatif");
    }
    if (age > 150) {
        throw new ValidationError("L'âge semble invalide");
    }
    return true;
}

try {
    validerAge(-5);
} catch (error) {
    if (error instanceof ValidationError) {
        console.error("Erreur de validation:", error.message);
    } else {
        console.error("Erreur inconnue:", error);
    }
}

6. Gestion des erreurs asynchrones

Avec Promises

fetch("https://api.example.com/data")
    .then(response => {
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.json();
    })
    .then(data => console.log(data))
    .catch(error => console.error("Erreur:", error));

Avec async/await

async function chargerDonnees() {
    try {
        let response = await fetch("https://api.example.com/data");
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        let data = await response.json();
        return data;
    } catch (error) {
        console.error("Erreur lors du chargement:", error);
        return null;
    }
}

7. Debugging avec console

console.log("Message normal");
console.warn("Avertissement");
console.error("Erreur");
console.info("Information");

// Afficher un objet
let user = { nom: "Alice", age: 25 };
console.table(user);

// Grouper des messages
console.group("Détails utilisateur");
console.log("Nom:", user.nom);
console.log("Age:", user.age);
console.groupEnd();

// Mesurer le temps
console.time("Operation");
// ... code ...
console.timeEnd("Operation");

8. Exercice pratique

// Fonction de validation avec gestion d'erreurs
function validerFormulaire(data) {
    try {
        if (!data.nom || data.nom.trim() === "") {
            throw new ValidationError("Le nom est requis");
        }

        if (!data.email || !data.email.includes("@")) {
            throw new ValidationError("Email invalide");
        }

        if (data.age < 18) {
            throw new ValidationError("Vous devez être majeur");
        }

        return { succes: true, message: "Formulaire valide" };
    } catch (error) {
        if (error instanceof ValidationError) {
            return { succes: false, message: error.message };
        }
        throw error; // Relancer si erreur inattendue
    }
}

// Test
let resultat1 = validerFormulaire({
    nom: "Alice",
    email: "alice@example.com",
    age: 25
});
console.log(resultat1); // { succes: true, ... }

let resultat2 = validerFormulaire({
    nom: "",
    email: "invalid",
    age: 15
});
console.log(resultat2); // { succes: false, message: "Le nom est requis" }

Conclusion

Vous savez maintenant gérer les erreurs en JavaScript ! Dans le prochain chapitre, nous allons découvrir la programmation orientée objet.

Évaluation des acquis

Quiz du chapitre 9

Correction immédiate
Q1 Quelle instruction est utilisée pour tester un bloc de code pour des erreurs ?
Q2 Quel objet est généralement utilisé pour obtenir des informations sur une erreur en JavaScript ?
Ateliers pratiques & Projets

Testez vos compétences avec nos exercices guidés et le tuteur IA.

Ateliers pratiques & Corrigés détaillés

Ateliers pratiques & Corrigés

#1 — SetTimeout
Atelier #1

Exécute une fonction après un délai de 2 secondes.

Correction instantanée et bienveillante
Diagnostic du tuteur IA Weegosoft :
Consulter la solution type du formateur
Solution de référence :
setTimeout(() => { console.log("2 secondes passées"); }, 2000);
#2 — Promesse simple
Atelier #2

Comment appelle-t-on le résultat positif d'une Promesse (quand elle réussit) ?

Correction instantanée et bienveillante
Diagnostic du tuteur IA Weegosoft :
Consulter la solution type du formateur
Solution de référence :
Une résolution (resolve). On utilise .then() pour intercepter le résultat.
#3 — Utilisation de Fetch
Atelier #3

Fais une requête GET simple vers une API 'https://api.test.com/data'.

Correction instantanée et bienveillante
Diagnostic du tuteur IA Weegosoft :
Consulter la solution type du formateur
Solution de référence :
fetch("https://api.test.com/data") .then(response => response.json()) .then(data => console.log(data));
#4 — Async / Await
Atelier #4

Réécris la requête Fetch ci-dessus en utilisant async et await.

Correction instantanée et bienveillante
Diagnostic du tuteur IA Weegosoft :
Consulter la solution type du formateur
Solution de référence :
async function fetchData() { const res = await fetch("https://api.test.com/data"); const data = await res.json(); console.log(data); }
#5 — Gestion d'erreur (Try/Catch)
Atelier #5

Comment capturer une erreur dans une fonction asynchrone ?

Correction instantanée et bienveillante
Diagnostic du tuteur IA Weegosoft :
Consulter la solution type du formateur
Solution de référence :
async function safeFetch() { try { const res = await fetch(url); } catch (error) { console.error("Erreur détectée : ", error); } }
Besoin d'aide ?
Tuteur Virtuel
Bonjour ! Je suis votre tuteur virtuel. Comment puis-je vous aider avec ce cours aujourd'hui ?
Historique des conversations
Chargement...