У меня есть два примера кода для обнаружения ошибки обещания. Как лучше и почему так?
У меня есть этот код с .catch()
Message.receive($scope.reference).then(function (response) {
// on success
}).catch(function (error) {
// on error
});
Также у меня есть этот код без .catch()
Message.receive($scope.reference).then(function (response) {
// on success
}, function (error) {
// on error
});
foo.then(success, error)
выполняет тот или иной обратный вызов в зависимости от того, вызвала ли foo
ошибку или нет. Если success
вызывает ошибку, вы получите неперехваченную ошибку, если только не соедините другую .catch
.
foo.then(success).catch(error)
перехватывает любую ошибку, вызванную foo
или success
. Если foo
вызывает ошибку, success
пропускается.
Это не то, что лучше, это зависит от того, какую цепочку обработки ошибок вы хотите установить.
try/catch действительно дорог, и всегда хорошо передавать ошибки в обратных вызовах (предпочтительно первые аргументы). Поправьте меня, если я ошибаюсь
@Shubh Какое отношение это имеет к вопросу или ответу?
Лучший способ отловить ошибки?? @melpomene, это обратный вызов или ловушка?
@Shubh 1) Это не обязательно должно быть выброшенное исключение, это может быть просто отклоненное обещание. 2) Использование обратных вызовов в стиле (err, data)
— это то, что использовалось до того, как промисы действительно появились. Если вы используете этот стиль с промисами, вы скорее упускаете суть.
@Shubh Если у вас есть другой вопрос, задайте его как новый вопрос. Это не имеет ничего общего с кодом OP.
У меня были сомнения, которые развеял deceze @melpomene
Итак, подводя итог, foo.then(success).catch(error)
может поймать больше ошибок, чем foo.then(success, error)
. Это утверждение верно? Потому что я хочу поймать любое исключение и отобразить сообщение об ошибке.
@Veselin Да, это правильно. Но это не является автоматически «лучше», так как на самом деле вам может понадобиться foo.then(success, error).catch(ultimateError)
, в зависимости от того, как вы хотите обрабатывать ошибку который.
Кто продолжает голосовать, чтобы закрыть это как «основанное на мнении»? Между двумя фрагментами кода существует семантическая разница, как объясняется в ответе deceze ниже.