Pull to refresh

Централизованная обработка исключений в Node.JS. Часть 2

Reading time 2 min
Views 5.3K


Четыре месяца назад я писал о том, как можно удобно ловить исключения в 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 даже по моему мнению еще не совсем идеален, я считаю, что это лучшее решение для того, чтобы обрабатывать асинхронные исключения.
Tags:
Hubs:
+12
Comments 20
Comments Comments 20

Articles

Information

Website
company.alawar.ru
Registered
Founded
Employees
201–500 employees
Location
Россия