Andre_487
@Andre_487
Разработчик веб-сервисов

Обработка ошибок при асинхронном выполнении в JavaScript?

При синхронном выполнении кода исключения — очень удобный механизм обработки ошибок. Но в JavaScript очень много кода, выполняемого асинхронно — к примеру, запросы на сервер. Часто для обработки ошибок в этом случае используются коллбэки, но по удобству такая методика не сравнится с исключениями, при которых стек вызовов самостоятельно раскручивается до места перехвата.


Я долго и упорно искал что-то по этой теме, но находил только что-то вроде этого:
try {
    helloWorld();
}
catch (e) {
    alert(e.message);
}

function helloWorld() {
    throw new Error('Hello world!');
}


Есть ли хорошие статьи по поводу обработки ошибок при асинхронном выполнении, особенно в JavaScript? Может быть, существуют специфические паттерны или малоизвестные возможности языка?
  • Вопрос задан
  • 4161 просмотр
Решения вопроса 1
Mithgol
@Mithgol
Асинхронная функция потому и асинхронная, что возврат из неё (return) происходит существенно быстрее, нежели заканчивает выполняться исходный код запущенных изнутри неё операций и callbacks.

Следовательно, обёртывать такую функцию в конструкцию try-catch бесполезно (когда возврат из функции случился, тогда никакие ошибки ещё не могли произойти — а значит, ловить ещё нечего), и для обработки ошибок поневоле приходится применять передачу их callback-функциями, а не бросание оператором throw.

Для такой передачи, как правило, применяется первый же параметр callback-функции, то есть вызов её имеет вид «callback(err, data)», где error ошибка или null, а data данные, передаваемые при отсутствии ошибки. (Параметров с данными может быть несколько.)

Смысл такого порядка, при котором параметр ошибки идёт первым по счёту, заключается в том, что вместо «throw new Error()» используется простой вызов callback-функции с единственным параметром: «callback(new Error()); return;» — в общем-то, это не слишком-то сложнее, чем throw.

Чтобы соответствовать этому порядку, внутри такой callback-функции сперва происходит сравнение первого параметра с величиною null (что позволяет при их неравенстве сразу заметить произошедшую ошибку, при необходимости тотчас же обработать её или передать родительской callback-функции), и лишь затем приступают к обработке данных, полученных через последующие параметры функции.

Я не разделяю мнения , согласно которому библиотеки таких функций, которые специально предназначены для обработки ошибок в асинхронных функциях, являются кривыми, и сделаны худо, и чрезмерно наполнены, и не могут служить подспорьем. Я держусь противоположного мнения: библиотека async представляется мне удобным средством для управления асинхронными функциями и вообще, и в частности — для обработки ошибок в них.

Да это и не только моё мнение: мне доводилось ужé подмечать в январе нынешнего (2012) года, что пакет async вошёл в десятку наиболее используемых модулей для движка Node по свéдениям сайта «The Node Toolbox», основывающимся на статистике пакетного менеджера npm.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Не совсем ответ на вопрос, но лично мне удобнее console.log() вместо alert()
Ответ написан
@egorinsk
Для асинхронных вызовов пишут функции в цепочку в виде:

callFunction(function() { /* async code */ }).then(function() { /* async code */ }).then(function(){ /* async code */ }).onError(function() { /* error handler */ });

Такая функция организует порядок выполнения и обработку ошибок сама. Есть какие-то библиотеки для этого, но я уверен, что они все кривые, плохо сделанные и overbloated, так что лучше написать свой код для таких целей.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
CODEFATHER Москва
от 70 000 до 150 000 руб.
Acme Crypto Corp Нижний Новгород
от 150 000 до 250 000 руб.
17 янв. 2019, в 05:58
700 руб./в час
16 янв. 2019, в 22:45
1000 руб./за проект