Pull to refresh

Comments 20

Не нужно бросать исключения в асинхронных окружениях :)

Если есть вероятность поймать исключения, то она должна быть локализована. Типа

function parseJSON(json, callback) {
    try {
        callaback(null, JSON.parse(json))
    } catch (e) {
        callback(e)
    }
}


И не будет никаких проблем. Разве что вы забудете повесть обработчики ошибок.
Можно и так. Но далеко не всем это удобно, особенно принимая во внимание, что исключения могут возникать во всяких неожиданных местах. Получается, что _все_ потенциально асинхронно вызываемые функции в проекте (включая анонимные) должны начинаться блоком try, и это при том, что она не содержит логики обработки этого исключения, а просто перенаправляет его в коллбэк. Простите, но это какой-то коллбэк-ад получится.

Во сколько строк уложится аналог этого кода: gist.github.com/4231149?
Не все, а только те, кто способен выбросить исключения. На самом деле таких не так уж много :)

У вас такой же callback hell, если вы в него верите, исключения передаются в коллбеки.

И да, асинхронные функции не должны выбрасывать исключений.
> Не все, а только те, кто способен выбросить исключения.

Про то и речь, что почти любая способна. Или вы всегда валидируете типы аргументов, наличие и типы всех полей объектов, к которым обрщаетесь, и т.д.? Дак это еще больше кода будет.

> У вас такой же callback hell, если вы в него верите, исключения передаются в коллбеки.

Но, к счастью, он скрыт от моих глаз и рук.

> И да, асинхронные функции не должны выбрасывать исключений.

Это в вас говорит религия :) А во мне говорит другая. Так что боюсь, мы с вами по этому вопросу не сможем прийти к общему знаменателю. В мире моеко текущего проекта исключения используются на полную мощность. И благодаря этим модулям, это не требует большого внимания с моей стороны.
Не все, а только те, кто способен выбросить исключения. На самом деле таких не так уж много :)

Решил поискать слово throw в исходниках стандартных модулей. Так вот 36 модулей из 25 содержат функции/методы выбрасывающие исключения.
Мне тоже больше нравится в своем коде передавать ошибку первым параметром callback, но вызов любой внешней функции потенциально может завершиться исключением.
Кстати, даже эта функция не гарантирует, что она не выкинет исключение :)
С исключениями в V8 надо быть очень осторожными. Разработчики из гугла на одной из конференций говорили, что движок очень плохо оптимизирует код в try { } блоке. Поэтому лучше оборачивать в try-catch только те куски кода, где действительно может появится исключения.
Буду признателен, если сможете вспомнить ссылочку.
Судя по ссылке blog.dubbelboer.com/2012/04/16/node-try-catch.html, если блок try catch вынесен за пределы функции, этой проблемы не наблюдается. Так что это скорее должно быть адресовано комментариям bobrik'а, а не самой статье. Или я что-то не упустил?
UFO just landed and posted this here
Новость интересная, но я разделяю то мнение, которое bobrik высказал.

Всякий автор асинхронной функции вместо «throw new Error('…')» может (и должен, должен непременно!) использовать «callback (new Error('…')); return», и тем невозбранно достигнуть желаемого.
Мне хотелось бы понять пару вещей:
Как гарантировать, что функция не выкинет exception и как это компактно записать?
Как добиться того же самого при работе со сторонними библиотеками?
И желательно, чтобы это минимально сказывалось на производительности, как упомянуто выше.
Я давал эту же ссылку в первой части статьи.
А вы ими пользуетесь?
Это конечно хорошо, но Stability: 1 — Experimental
Домены — веселая штука.
1) Требуют костылей для отлова синхронных исключений. github.com/joyent/node/issues/4770
2) Требуют костылей для правильной работы вложенных доменов: github.com/joyent/node/issues/4733
Тем не менее, автор модуля trycatch перешел на их использование.
Лучше всего не выдумывать всякие сложные конструкции, а считать исключения в асинхронном коде критической ошибкой, всегда роняющей приложение (каковой они по умолчанию и являются) и лечить не симптомы, а причину — исправлять код.

А с падающим из-за исключения приложением поступать так же, как с приложением, падающим по любой другой причине: отсутствие памяти, segfault, отключение питания на сервере,…
Sign up to leave a comment.