Блок try / catch и исключение необработанного обещания

Я хотел протестировать свою асинхронную функцию, запрашивая несуществующую таблицу. Поэтому ошибка создается намеренно.

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.

Ты можешь сказать мне, почему?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
0
6 056
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы получаете 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;
}

Что касается вашей текущей ошибки, вы пытаетесь выполнить запрос к несуществующей таблице.

Вы можете узнать больше об этом в следующем вопросе: Что такое необработанный отказ от обещания?

На самом деле проблема в том, что я тупо выдавал ошибку JavaScript в моем блоке catch. ?

Fredo Corleone 07.04.2019 13:00

Вы читали мой ответ? Я сказал именно это, 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, а не проглатывать ошибку .

Marcos Casagrande 07.04.2019 16:15

На самом деле я не могу этого сделать, это часть обработчика маршрута, и я упростил его в виде отдельной функции, просто чтобы попросить о помощи. Это должна быть попытка отлова или обработка ошибок на месте, потому что вызов функции обрабатывается фреймворком и по умолчанию используется некоторый внутренний механизм перехвата ошибок. Пожалуйста, удалите отрицательный голос за мой ответ.

Fredo Corleone 07.04.2019 21:04

Я не буду удалять отрицательный голос, потому что вы сказали то же самое, что и я, и приняли ваш ответ, который является точной информацией.

Marcos Casagrande 07.04.2019 21:06

Вы упустили простой и единственный факт, почему мой код выдавал необработанное сообщение об ошибке. Обработка ошибок в порядке, но я тупо перебрасывал ошибку. Очевидно, я не хотел такого поведения, но я был таким неопытным ...

Fredo Corleone 07.04.2019 21:08
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
Marcos Casagrande 07.04.2019 21:10

Я НЕ ХОТЕЛ УДАЛИТЬ ОШИБКИ. Я ХОЧУ УСТРАНИТЬ ЭТУ ОШИБКУ, ЧТОБЫ ИЗБЕЖАТЬ НЕЗАВИСИМЫХ ОБЕЩАНИЙ ОТКЛОНЕНИЯ, ПОТОМУ ЧТО ЭТИ ВЕЧНО ОСТАНОВИТ ПРОЦЕСС В NODE.JS.

Fredo Corleone 07.04.2019 21:12

Чтобы избежать необработанного отказа от обещания, вы добавляете .catch. Ваш код плохой, и я отвечу, как это сделать правильно. Я не буду снимать голос против, потому что вы кричите. И я знаю, что такое UnhandledPromiseRejection, вам не нужно читать мне лекции об этом, потому что вы были тем, кто не знал, что это такое и как с ними справиться.

Marcos Casagrande 07.04.2019 21:17

Чтобы избежать необработанного отклонения обещания, вы можете использовать async / await с блоком try / catch или привязать catch к обещанию. Это не неправильное поведение. Неправильное поведение было вызвано глупым и наивным повторным возвратом ошибки. Возможно, я получил эту привычку, играя с Observable, где вы ловитеError (throwError). В любом случае я должен поблагодарить вас за время и усилия.

Fredo Corleone 07.04.2019 21:21

И вот что я говорю: не повторяйте ошибку снова. Я не буду больше это обсуждать, ваш ответ ничего не добавляет к сайту, поэтому голос против. Ваше здоровье.

Marcos Casagrande 07.04.2019 21:24

Ваш код тоже ничего не добавляет на сайт, потому что вы исправляете наивную ошибку, структурно изменяя мой код, когда исправление было намного проще (удаление throw и размещение логики обработки прямо здесь). Мне интересно узнать больше об этом вашем комментарии: «Глотать ошибку так глубоко в коде - плохая логика». Какие возможные предостережения?

Fredo Corleone 07.04.2019 21:25
Ответ принят как подходящий

Привет себе из прошлого!

Ваша консоль отображает необработанную ошибку, потому что в вашем блоке catch вы (я) глупо повторно выдавали ошибку JavaScript. ?

Просто удалите этот throw new Error(ex) из вашего catch и вместо этого замените его логикой обработки ошибок.

Lol такая же проблема для меня

jedu 02.08.2019 21:03

Другие вопросы по теме