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

в 4:53, , рубрики: exception handling, javascript, node.js, nodejs, Блог компании «Alawar Entertainment», метки: , ,

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

Четыре месяца назад я писал о том, как можно удобно ловить исключения в 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);
});

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

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);
});

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

К слову, до недавнего времени в trycatch предварительное составление длинного стэк трейса было обязательным, что по сравнению с control-block давало производительность примерно в 70-100 раз ниже. Я обсудил эту проблему с автором, предложил возможное решение, и вчера им была выпущена новая версия, которая теперь базируется на модуле control-block, что даёт высокую скорость работы модуля. При этом оставлена возможность включать длинные стэк трейсы, когда это необходимо, например, на сервере, где ведётся разработка, а скорость не критична. Получился этакий симбиоз, который взял от обоих проектов только самое лучшее.

Так что несмотря на то, что модуль trycatch даже по моему мнению еще не совсем идеален, я считаю, что это лучшее решение для того, чтобы обрабатывать асинхронные исключения.

Автор: wickedweasel

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js