- PVSM.RU - https://www.pvsm.ru -

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

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

Четыре месяца назад я писал [1] о том, как можно удобно ловить исключения в node.js, в том числе и асинхронные, то есть те, которые брошены кодом, который вызван event loop'ом. В той статье я использовал модуль control-block [2] для борьбы с ними, так как стандартный блок try-catch не справлялся.

Как оказалось, примерно в то же время Adam Crabtree выпустил стабильную версию похожего на control-block модуля под названием trycatch [3].

Модуль 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);
});

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

3. Long stack traces

Благодаря интеграции с модулем 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);
});

Этот код уже выведет такой стэк:
Централизованная обработка исключений в Node.JS. Часть 2

К слову, до недавнего времени в 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/