- PVSM.RU - https://www.pvsm.ru -
Четыре месяца назад я писал [1] о том, как можно удобно ловить исключения в node.js, в том числе и асинхронные, то есть те, которые брошены кодом, который вызван event loop'ом. В той статье я использовал модуль control-block [2] для борьбы с ними, так как стандартный блок try-catch не справлялся.
Как оказалось, примерно в то же время Adam Crabtree выпустил стабильную версию похожего на control-block модуля под названием trycatch [3].
Модуль trycatch даёт некоторые дополнительные возможности, которых нет в control-block:
Для этого модуль trycatch при загрузке подменяет функции setTimeout, setInterval, функции модуля fs, так что отпадает необходимость в постоянных вызовах Block.guard() при передаче коллбэков. Это делается автоматически.
Из-за необходимости оборачивания коллбэков, 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);
});
Он выведет:
Благодаря интеграции с модулем long-stack-traces [4] модуль 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 раз ниже. Я обсудил эту проблему [5] с автором, предложил возможное решение, и вчера им была выпущена новая версия [6], которая теперь базируется на модуле control-block, что даёт высокую скорость работы модуля. При этом оставлена возможность включать длинные стэк трейсы, когда это необходимо, например, на сервере, где ведётся разработка, а скорость не критична. Получился этакий симбиоз, который взял от обоих проектов только самое лучшее.
Так что несмотря на то, что модуль trycatch даже по моему мнению еще не совсем идеален [7], я считаю, что это лучшее решение для того, чтобы обрабатывать асинхронные исключения.
Автор: wickedweasel
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/22053
Ссылки в тексте:
[1] я писал: http://habrahabr.ru/post/147233/
[2] control-block: https://github.com/AlexeyKupershtokh/control-block
[3] trycatch: https://github.com/CrabDude/trycatch
[4] long-stack-traces: https://github.com/tlrobinson/long-stack-traces
[5] обсудил эту проблему: https://github.com/CrabDude/trycatch/issues/15
[6] была выпущена новая версия: https://github.com/CrabDude/trycatch/commit/5cf66ba8da8ea758ada48ddbe966a4d028e04abd
[7] не совсем идеален: https://github.com/CrabDude/trycatch/issues/created_by/AlexeyKupershtokh?state=open
[8] Источник: http://habrahabr.ru/post/158905/
Нажмите здесь для печати.