#javascript #error-handling #promise #try-catch #throw
#javascript #обработка ошибок #обещание #попробуйте-поймать #выбросить
Вопрос:
если я просто выдаю случайную ошибку, мой код работает нормально:
throw new Error('you got error')
но если я хочу выдать ее из оператора .catch, например:
message.react(e).catch(()=>{throw new Error('you got error')});
Затем я получаю сообщение об ошибке, которое регистрируется следующим образом: (node:21609) UnhandledPromiseRejectionWarning: Error: you got error
, и не попадает в мой вышестоящий обработчик ошибок:
//errors from within catch() don't reach this
process.on('uncaughtException', function(err){ console.log('error caught', err); });
Я не хочу использовать promises, но, к сожалению, это из библиотеки, где у меня нет выбора.
Как я могу выдать исключение из catch таким образом, чтобы это не было необработанным отклонением обещания?
Комментарии:
1. Два варианта. 1) Не выбрасывайте в первую очередь или 2) Перехватывайте ошибку на более высоком уровне. Мы не можем быть более конкретными, чем это, потому что вы не показываете нам общую структуру этого кода, чтобы мы могли определить, как еще вы можете распространить и перехватить эту ошибку на более высоком уровне. В случае, если вы не поняли, вы не поймаете отклоненное обещание, подобное этому, просто попробовав / поймав на более высоком уровне. Вы должны фактически перехватывать отклонения по ЭТОМУ конкретному обещанию либо на этом уровне, либо распространяя отклонение на более высокий уровень и перехватывая его там.
2. @jfriend00 Я просто пытаюсь перехватить все свои ошибки с помощью process.on(‘uncaughtException’). Как мне распространить отклонение на более высокий уровень?
3.
process.on('uncaughtException')
НИКОГДА не должно быть вашим основным методом обработки ошибок для ошибок любого типа. К тому времени, когда туда попадает ошибка, ваш сервер находится в неизвестном состоянии. Вы распространяете отклоненное обещание на более высокий уровень, возвращая это обещание, а затем используя.catch()
его на более высоком уровне.4. ну, я хочу печатать ошибки согласованным образом, и это единственный способ сделать это
Ответ №1:
Если вы просто пытаетесь зарегистрировать необработанные отклонения обещаний в целях диагностики, вы можете сделать это с помощью:
process.on('unhandledRejection', (reason, promise) => {
console.log('Unhandled Rejection at:', promise, 'reason:', reason);
// Application specific logging, throwing an error, or other logic here
});
Смотрите Документ здесь.
Как я уже говорил ранее, это не должно быть тем, как вы на самом деле обрабатываете отклонения обещаний. Они должны быть обнаружены в вашем собственном коде на более низком уровне, где у вас есть точный контекст для конкретной операции, которая создала ошибку. Этот код должен быть предназначен только для диагностической отладки, куда вы затем идете и исправляете фактический код, который не обрабатывал отклонение обещания там, где оно должно быть обработано.
Комментарии:
1. В настоящее время они попадают в свой собственный код, но затем они не регистрируются должным образом, если я не скопирую и не вставлю кучу дерьма в каждое отдельное обещание. Основная проблема заключается в том, что вы не можете создать пользовательские функции регистрации ошибок, потому что это теряет контекст.
2. @stackers — ошибки должны регистрироваться там, где они имеют значение, а не в одном глобальном месте. Именно так работает код. Вам не нужно регистрировать их в каждом отдельном обещании. Обычно вы регистрируете их на уровне для операции, которая имеет смысл, и вы регистрируете их только тогда, когда ошибки являются неожиданными или необычными. Например, у вас могут быть некоторые ожидаемые ошибки, которые возникают, когда не найден файл, который, как уже известно вашему коду, может присутствовать или отсутствовать. Итак, если смысл того, что вы пытаетесь здесь сделать, состоит в том, чтобы позволить ошибкам распространяться до некоторого необработанного высокого уровня, чтобы вы могли регистрировать их глобально, это ошибочная идея.
3. @stackers — я пытался помочь вам здесь, но неясно, что еще означает этот вопрос или как помочь дальше.
4. Если я поймаю необработанное отклонение, а затем завершу процесс, это было бы хорошо, верно?
5. @stackers — в качестве поддержки для диагностики только там, где вы собираете информацию, а затем размещаете правильную обработку ошибок там, где она должна была быть. Обычно это не было бы вашим обычным ожидаемым потоком кода.