# Personnaliser les pages 404 et 401

> Enregistrez des gestionnaires ROUTE('#404') et ROUTE('#401') pour remplacer les pages d'erreur intégrées, et déclenchez-les vous-même avec $.fallback().

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: fr
Content-SHA256: 9d74d8c422bf4dba87618da4c4e6aa40d19f03e1651df63f6c43a3e170f2b240
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Quand Total.js ne peut pas servir une requête, il affiche une page d'erreur intégrée. Une route dont l'URL est `#` suivi du code de statut la remplace : `ROUTE('#404', fn)` pour « introuvable », `ROUTE('#401', fn)` pour « non autorisé », et de même pour `#400`, `#431` et d'autres. Le gestionnaire reçoit `$` comme n'importe quelle route, mais **vous définissez vous-même le statut** avec `$.response.status` : Total.js ne le fait pas à votre place quand un gestionnaire personnalisé existe. Sans gestionnaire personnalisé, la page intégrée est utilisée et les requêtes AJAX (en-tête `x-requested-with`) reçoivent une erreur JSON au lieu de HTML.

`$.fallback(code)` envoie la requête courante au gestionnaire de `code`, ce qui permet de répondre 404 pour un enregistrement inexistant ou 403 pour une ressource interdite depuis votre propre code.

```js controllers/errors.js
exports.install = function() {
	ROUTE('#404', not_found);
	ROUTE('#401', unauthorized);
	ROUTE('GET /items/{id}/', item);
	ROUTE('+GET /private/', private_page);
};

var items = { '1': 'First item' };

function item($) {
	var name = items[$.params.id];
	if (name)
		$.json({ name: name });
	else
		$.fallback(404);
}

function private_page($) {
	$.plain('secret');
}

function not_found($) {
	$.response.status = 404;
	$.html('<h1>Nothing here</h1><p>' + $.url.encode() + ' does not exist.</p>');
}

function unauthorized($) {
	$.response.status = 401;
	$.json({ error: 'Please sign in first' });
}

AUTH(function($) {
	$.invalid();
});
```
