Я хотел протестировать свою асинхронную функцию, запрашивая несуществующую таблицу. Поэтому ошибка создается намеренно.
async function getPosts() {
try {
const connection = await dbConnection()
const result = await connection.query('SELECT * FROM x')
await connection.release()
console.info(result)
}
catch(ex) {
throw new Error(ex)
}
}
Когда я вызываю эту функцию:
UnhandledPromiseRejectionWarning: Error: Error: ER_NO_SUCH_TABLE: Table 'test.x' doesn't exist.
Ты можешь сказать мне, почему?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы получаете UnhandledPromiseRejectionWarning, потому что не добавляете обработчик .catch в getPosts()
getPosts()
.then(console.info)
.catch(console.error); // You're missing this
Или используя async/await
try {
const posts = await getPosts();
console.info(posts);
} catch(e) { // Missing this
console.error(e);
}
Нет необходимости добавлять try/catch в вашу функцию getPosts, если вы собираетесь снова выдать ошибку без каких-либо изменений. Просто позвольте ему всплыть и обработайте ошибку при вызове getPosts(), как показано выше.
async function getPosts() {
const connection = await dbConnection()
const result = await connection.query('SELECT * FROM x')
await connection.release()
return result;
}
Что касается вашей текущей ошибки, вы пытаетесь выполнить запрос к несуществующей таблице.
Вы можете узнать больше об этом в следующем вопросе: Что такое необработанный отказ от обещания?
Вы читали мой ответ? Я сказал именно это, There is no need to add a try/catch on your getPosts function if you're going to throw the error again without any modification, и это плохая логика, чтобы проглотить ошибку, которая глубоко в коде, getPosts должна выдавать, если БД выходит из строя, и вы должны поймать ее, когда вы вызываете getPosts, а не проглатывать ошибку .
На самом деле я не могу этого сделать, это часть обработчика маршрута, и я упростил его в виде отдельной функции, просто чтобы попросить о помощи. Это должна быть попытка отлова или обработка ошибок на месте, потому что вызов функции обрабатывается фреймворком и по умолчанию используется некоторый внутренний механизм перехвата ошибок. Пожалуйста, удалите отрицательный голос за мой ответ.
Я не буду удалять отрицательный голос, потому что вы сказали то же самое, что и я, и приняли ваш ответ, который является точной информацией.
Вы упустили простой и единственный факт, почему мой код выдавал необработанное сообщение об ошибке. Обработка ошибок в порядке, но я тупо перебрасывал ошибку. Очевидно, я не хотел такого поведения, но я был таким неопытным ...
There is no need to add a try/catch on your getPosts function if you're going to throw the error again without any modificationЯ НЕ ХОТЕЛ УДАЛИТЬ ОШИБКИ. Я ХОЧУ УСТРАНИТЬ ЭТУ ОШИБКУ, ЧТОБЫ ИЗБЕЖАТЬ НЕЗАВИСИМЫХ ОБЕЩАНИЙ ОТКЛОНЕНИЯ, ПОТОМУ ЧТО ЭТИ ВЕЧНО ОСТАНОВИТ ПРОЦЕСС В NODE.JS.
Чтобы избежать необработанного отказа от обещания, вы добавляете .catch. Ваш код плохой, и я отвечу, как это сделать правильно. Я не буду снимать голос против, потому что вы кричите. И я знаю, что такое UnhandledPromiseRejection, вам не нужно читать мне лекции об этом, потому что вы были тем, кто не знал, что это такое и как с ними справиться.
Чтобы избежать необработанного отклонения обещания, вы можете использовать async / await с блоком try / catch или привязать catch к обещанию. Это не неправильное поведение. Неправильное поведение было вызвано глупым и наивным повторным возвратом ошибки. Возможно, я получил эту привычку, играя с Observable, где вы ловитеError (throwError). В любом случае я должен поблагодарить вас за время и усилия.
И вот что я говорю: не повторяйте ошибку снова. Я не буду больше это обсуждать, ваш ответ ничего не добавляет к сайту, поэтому голос против. Ваше здоровье.
Ваш код тоже ничего не добавляет на сайт, потому что вы исправляете наивную ошибку, структурно изменяя мой код, когда исправление было намного проще (удаление throw и размещение логики обработки прямо здесь). Мне интересно узнать больше об этом вашем комментарии: «Глотать ошибку так глубоко в коде - плохая логика». Какие возможные предостережения?
Привет себе из прошлого!
Ваша консоль отображает необработанную ошибку, потому что в вашем блоке catch вы (я) глупо повторно выдавали ошибку JavaScript. ?
Просто удалите этот throw new Error(ex) из вашего catch и вместо этого замените его логикой обработки ошибок.
Lol такая же проблема для меня
На самом деле проблема в том, что я тупо выдавал ошибку JavaScript в моем блоке
catch. ?