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

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

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


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

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


Есть ли хорошие статьи по поводу обработки ошибок при асинхронном выполнении, особенно в JavaScript? Может быть, существуют специфические паттерны или малоизвестные возможности языка?
  • Вопрос задан
  • 4374 просмотра
Решения вопроса 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, так что лучше написать свой код для таких целей.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы