Je suis nouveau sur node.js même si je suis assez familier avec JavaScript en général. Ma question est à propos des "meilleures pratiques" sur la façon de gérer les erreurs dans node.js.
Normalement lors de la programmation de serveurs web, des serveurs FastCGI ou des pages web dans différentes langues, je suis en utilisant les Exceptions avec le blocage des gestionnaires dans un multi-threading de l'environnement. Lorsqu'une demande arrive j'ai l'habitude de faire quelque chose comme ceci:
function handleRequest(request, response) {
try {
if (request.url=="whatever")
handleWhateverRequest(request, response);
else
throw new Error("404 not found");
} catch (e) {
response.writeHead(500, {'Content-Type': 'text/plain'});
response.end("Server error: "+e.message);
}
}
function handleWhateverRequest(request, response) {
if (something)
throw new Error("something bad happened");
Response.end("OK");
}
De cette façon, je peux toujours gérer les erreurs internes et envoyer une réponse valide à l'utilisateur.
Je comprends que le node.js on est censé faire des appels non bloquants qui conduit évidemment à divers nombre de rappels, comme dans cet exemple:
var sys = require('sys'),
fs = require('fs');
require("http").createServer(handleRequest).listen(8124);
function handleRequest(request, response) {
fs.open("/proc/cpuinfo", "r",
function(error, fd) {
if (error)
throw new Error("fs.open error: "+error.message);
console.log("File open.");
var buffer = new require('buffer').Buffer(10);
fs.read(fd, buffer, 0, 10, null,
function(error, bytesRead, buffer) {
buffer.dontTryThisAtHome(); // causes exception
response.end(buffer);
}); //fs.read
}); //fs.open
}
Cet exemple va tuer complètement le serveur car les exceptions ne sont pas interceptés. Mon problème est que je ne peux pas utiliser un seul try/catch plus et ne peut donc pas généralement attraper toute erreur qui pourrait être soulevée au cours du traitement de la demande.
Bien sûr, je pourrais ajouter un try/catch dans chaque rappel mais je n'aime pas cette approche car ensuite, c'est au programmeur de ne pas oublier un try/catch. Pour un serveur complexe avec beaucoup de différentes et complexes gestionnaires ce n'est pas acceptable.
Je pourrais utiliser un gestionnaire global d'exception (la prévention de la compléter crash du serveur), mais je ne peux pas envoyer une réponse à l'utilisateur, car je ne sais pas qui demande de mener à l'exception. Cela signifie également que la demande reste non gérée/open et le navigateur attend toujours une réponse.
Quelqu'un avoir un bon, solide comme le roc de la solution?