An asynchronous try catch / exception handler with long stack traces for node.js
See the "Background" from the long-stack-traces module.
npm install trycatch
trycatch(function() {
function f() {
throw new Error('foo');
}
setTimeout(f, Math.random()*1000);
setTimeout(f, Math.random()*1000);
}, function(err) {
console.log("This is an asynchronous scoped error handler!\n", err.stack);
});
$ node examples/setTimeout.js
This is an asynchronous scoped error handler!
Error: foo
at Object.f (/path/to/trycatch/examples/setTimeout.js:5:9)
at Timer.callback (timers.js:83:39)
----------------------------------------
at setTimeout
at /path/to/trycatch/examples/setTimeout.js:8:2
at Object.<anonymous> (/path/to/trycatch/examples/setTimeout.js:3:1)
at Module._compile (module.js:404:26)
at Object..js (module.js:410:10)
at Module.load (module.js:336:31)
This is an asynchronous scoped error handler!
Error: foo
at Object.f (/path/to/trycatch/examples/setTimeout.js:5:9)
at Timer.callback (timers.js:83:39)
----------------------------------------
at setTimeout
at /path/to/trycatch/examples/setTimeout.js:9:2
at Object.<anonymous> (/path/to/trycatch/examples/setTimeout.js:3:1)
at Module._compile (module.js:404:26)
at Object..js (module.js:410:10)
at Module.load (module.js:336:31)
http.createServer(function(req, res) {
trycatch(function() {
setTimeout(function() {
throw new Error('Baloney!');
}, 1000);
}, function(err) {
res.writeHead(500);
res.end(err.stack);
});
}).listen(8000);
Visit http://localhost:8000 and get your 500.
http.createServer(function(req, res) {
trycatch(function() {
process_request(req, res);
}, function(err) {
res.writeHead(500);
res.end(err.stack);
});
}).listen(8000);
function process_request(req, res) {
// open db connection
open_some_db();
trycatch(function() {
setTimeout(function() {
throw new Error('whoopsy');
}, 100);
}, function(err) {
// close the db connection
close_some_db();
// bubble the error
throw err;
});
}
This will allow your function to close the db before your 500 error.