Gestion des erreurs : try / catch / throw / finally

try {
    throw "quelque chose s'est mal passé"
} catch (ton.err) {
    print("attrapé : " + err)
}

Toute erreur d'exécution — une erreur native (division par zéro, mauvais nombre d'arguments, index hors limites, ...) ou un throw explicite — peut être attrapée. La valeur attrapée est toujours le message de l'erreur sous forme de chaîne, lié au nom donné dans catch (nom). break, continue, et return traversent un try englobant sans y être affectés (ce ne sont pas des erreurs).

finally ajoute un bloc qui s'exécute toujours après le try (et son catch, s'il y en a un) — que le bloc se soit terminé normalement, ait levé une erreur, ou ait rencontré un return :

ton.function lireSansRisque() {
    try {
        return risque()
    } finally {
        print("nettoyage effectué")
    }
}

try a besoin d'au moins un catch/finally : catch seul (comme ci-dessus), finally seul (try { ... } finally { ... }, utile pour du nettoyage quand on veut que l'erreur continue de se propager), ou les deux ensemble sont tous valides.

Lancer n'importe quelle valeur (depuis beta-2.0.0) — throw accepte n'importe quelle valeur, et catch reçoit exactement cette valeur, donc une erreur peut transporter des données structurées. Les erreurs levées par l'interpréteur lui-même sont toujours reçues comme une chaîne ("Error at line 3: Division by zero.").

try {
    throw {code: 404, message: "introuvable"}
} catch (err) {
    print(err.code, err.message)      // 404 introuvable
}

ton.class ValidationError {
    ton.function init(field) { self.field = field }
    ton.function toString() { return "champ invalide : " + self.field }
}
try { throw ValidationError("email") } catch e { print(e) }   // champ invalide : email

Les erreurs des fonctions natives incluent maintenant la ligne de l'appel (Error at line 7: sum() expects an array of numbers (found a string).). Un return, break ou continue dans finally l'emporte sur celui en attente.

Modifier cette page sur GitHub