Четыре месяца назад я писал о том, как можно удобно ловить исключения в node.js, в том числе и асинхронные, то есть те, которые брошены кодом, который вызван event loop'ом. В той статье я использовал модуль control-block для борьбы с ними, так как стандартный блок try-catch не справлялся.
Как оказалось, примерно в то же время Adam Crabtree выпустил стабильную версию похожего на control-block модуля под названием trycatch.
Модуль trycatch даёт некоторые дополнительные возможности, которых нет в control-block:
1. Избавляет от необходимости дополнительно оборачивать коллбэки, переданные в setTimeout и т.д.
Для этого модуль trycatch при загрузке подменяет функции setTimeout, setInterval, функции модуля fs, так что отпадает необходимость в постоянных вызовах Block.guard() при передаче коллбэков. Это делается автоматически.
2. Как следствие, trycatch обеспечивает поддержку сторонних библиотек.
Из-за необходимости оборачивания коллбэков, control-block не мог отлавливать некоторые асинхронные исключения, которые возникали в сторонних библиотеках.
Пусть у нас есть такая неразумная сторонняя библиотека, которая не по зубам даже модулю control-block:
function blackBox() {
setTimeout(function() {
throw new Error('black box error');
}, 10);
}
А это — код, который благодаря trycatch теперь умеет c ней безопасно работать:
var trycatch = require('trycatch');
trycatch(function() {
setInterval(blackBox, 1000);
}, function(err) {
console.log('caught!');
console.log(err.stack);
});
Он выведет:
3. Long stack traces
Благодаря интеграции с модулем long-stack-traces модуль trycatch может помочь в отладке, если попросить его выводить длинные стэк трейсы, которые правильно отслеживают асинхронные исключения:
var trycatch = require('trycatch');
trycatch.configure({'long-stack-traces': true});
trycatch(function() {
setInterval(blackBox, 1000);
}, function(err) {
console.log('caught!');
console.log(err.stack);
});
Этот код уже выведет такой стэк:
К слову, до недавнего времени в trycatch предварительное составление длинного стэк трейса было обязательным, что по сравнению с control-block давало производительность примерно в 70-100 раз ниже. Я обсудил эту проблему с автором, предложил возможное решение, и вчера им была выпущена новая версия, которая теперь базируется на модуле control-block, что даёт высокую скорость работы модуля. При этом оставлена возможность включать длинные стэк трейсы, когда это необходимо, например, на сервере, где ведётся разработка, а скорость не критична. Получился этакий симбиоз, который взял от обоих проектов только самое лучшее.
Так что несмотря на то, что модуль trycatch даже по моему мнению еще не совсем идеален, я считаю, что это лучшее решение для того, чтобы обрабатывать асинхронные исключения.
Автор: wickedweasel