Как в случае браузерного, так и в случае серверного Javascript конструкция try/catch используется для отлова исключений в
синхронных операциях (пример: десериализация JSON-данных или валидация данных которые ввёл пользователь). Если требуется обрабатывать ошибки в
асинхронных операциях, то ошибка либо передается в callback-функцию (В Node.js общепринятым шаблоном вызова callback-функции является вызов вида callback(err, results), где лишь один из аргументов может принимать значения отличные от null.), либо в более сложных случаях генерируется событие 'error' объекта класса EventEmitter.
В Node.js try/catch используется
очень редко (в основном только при парсинге JSON-данных), это объясняется тем что большинство операций в Node.js асинхронны, как правило ошибку передают в callback-функцию или генерируют событие "error" у объекта класса EventEmitter.
Вот пример иллюстрирующий, что try/catch не отловит исключение возникшее при выполнении асинхронной операции:
function myApiFunc(callback)
{
/*
* Пример некорректного перехвата исключений
* в асинхронных операциях
*/
try {
doSomeAsynchronousOperation(function (err) {
if (err)
throw (err);
});
} catch (ex) {
callback(ex);
}
}
Дело в том, что исключение бросается и, соответственно , должно ловиться в том контексте, в котором
вызывается функция. В данном примере try/catch и вызов функции бросающей исключение выполнятся в разных контекстах в силу асинхронности функции doSomeAsynchronousOperation.