Как сгенерировать ошибки из асинхронных функций в Javascript?

  1. Как сгенерировать ошибки из асинхронных функций в Javascript: чему вы научитесь
  2. Как сгенерировать ошибки из асинхронных функций в Javascript: требования
  3. Как сгенерировать ошибки из асинхронных функций в Javascript: тестирование исключений
  4. Как сгенерировать ошибки из асинхронных функций в Javascript: завершение

Можно ли выкидывать ошибки из асинхронных функций в Javascript ?

выкидывать ошибки из асинхронных функций в Javascript

Тема освещалась сотни раз, но давайте посмотрим на это с точки зрения TDD .

Ответьте на вопрос, не глядя на Stackoverflow. Если вы знаете ответ, я впечатлен.

Если нет, то это тоже круто. Продолжайте читать, и вы найдете это!

Как сгенерировать ошибки из асинхронных функций в Javascript: чему вы научитесь

В следующем посте вы узнаете:

  • как бросать ошибки из асинхронных функций в Javascript
  • как проверить исключение из асинхронных функций с помощью Jest

Как сгенерировать ошибки из асинхронных функций в Javascript: требования

Чтобы следовать, вы должны иметь:

  • базовое понимание Javascript и ES6
  • рабочая установка Node.Js и Шутка

Используйте исключения, а не коды возврата (Чистый код) .

Бросать ошибки - лучшая практика для борьбы с неизвестными. То же правило применяется ко всем современным языкам: Java, Javascript, Python, Ruby.

Вы можете выбросить ошибки из функции, рассмотрите следующий пример в Javascript:

function upperCase (name) {if (typeof name! == "string") {throw TypeError ("name должно быть строкой"); } return name.toUpperCase (); } module.exports = upperCase;

И вот тест для этого (я использую Jest):

«использовать строгое»; const assert = require ("assert"); const upperCase = require ("../ function"); description ("upperCase function", () => {test ("выдает, когда имя не указано", () => {assert.throws (() => upperCase ());}); test ("выдает когда имя не является строкой ", () => {assert.throws (() => upperCase (9));});});

Вы также можете выдавать ошибки из классов ES6.

Я всегда добавляю конструктор для неожиданных значений при написании классов в Javascript.

Придуманный пример:

class Person {constructor (name) {if (typeof name! == "string") {throw TypeError ("name должно быть строкой"); } this.name = name; } // какой-то метод здесь} module.exports = Person;

И вот тест для класса:

«использовать строгое»; const assert = require ("assert"); const Person = require ("../ index"); description ("Класс Person", () => {test ("выдает, когда имя не указано", () => {assert.throws (() => new Person ());}); test ("it бросает, когда имя не является строкой ", () => {assert.throws (() => new Person (9));});});

Тест действительно проходит:

PASS test / index.test.js Класс Person ✓ выдает, когда имя не указано (1ms) ✓ выдает, когда имя не является строкой

Ухоженная!

Таким образом, все работает, как и ожидалось, вне зависимости от того, используете ли вы обычную функцию, конструктор класса (или метод).

Что если я захочу выдать ошибку из асинхронной функции ?

Могу ли я все еще использовать assert.throws в моем тесте?

Давайте разберемся.

Как сгенерировать ошибки из асинхронных функций в Javascript: тестирование исключений

Итак, вы знаете, что Javascript асинхронные функции не так ли?

Учитывая предыдущий класс:

class Person {constructor (name) {if (typeof name! == "string") {throw TypeError ("name должно быть строкой"); } this.name = name; } // какой-то метод здесь} module.exports = Person;

Предположим, вы хотите добавить асинхронный метод для извлечения данных об этом человеке. Такой метод занимает URL. Если URL-адрес не является строкой, мы выдаем ошибку, как в предыдущем примере.

Давайте обновим класс:

class Person {constructor (name) {if (typeof name! == "string") {throw TypeError ("name должно быть строкой"); } this.name = name; } async getData (url) {if (typeof url! == "string") {throw TypeError ("url должен быть строкой"); } // const response = await fetch (url) // do stuff}} module.exports = Person;

Что произойдет, если я выполню код?

Давай попробуем:

const Person = require ("../ index"); const valentinogagliardi = новый человек ("valentinogagliardi"); valentinogagliardi.getData ();

И вот оно:

UnhandledPromiseRejectionWarning: необработанное отклонение обещания (идентификатор отклонения: 1): TypeError: name должно быть строкой DeprecationWarning: необработанное отклонение обещания не рекомендуется. В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом завершения.

Неудивительно, что асинхронный метод возвращает отклонение Promise, но он не выдает в строгом смысле.

Ошибка заключена в отклонении обещания. Другими словами, я не могу использовать assert.throws для тестирования.

Давайте подтвердим с тестом:

«использовать строгое»; const assert = require ("assert"); const Person = require ("../ index"); description ("Методы Person", () => {test ("выдает, когда url не является строкой", () => {const valentinogagliardi = new Person ("valentinogagliardi"); assert.throws (() => valentinogagliardi .получить данные()); }); });

Тест не проходит, как ожидалось!

FAIL test / index.test.js Методы Person ›выдает, когда url не является строкой assert.throws (function) Ожидается, что функция выдаст ошибку. Но это ничего не бросало. Сообщение: отсутствует ожидаемое исключение.

Так? В чем подвох ? (Не каламбур предназначен). Барабанная дробь…

Асинхронные функции и асинхронные методы не выдают ошибки в строгом смысле .

Асинхронные функции и асинхронные методы всегда возвращают обещание, разрешенное или отклоненное.

Вы должны прикрепить then () и catch () , несмотря ни на что. (Или оберните метод внутри try / catch). Отклоненное обещание будет распространяться в стеке, если вы ловить это

Что касается теста, вот как это должно быть:

«использовать строгое»; const assert = require ("assert"); const Person = require ("../ index"); description ("Методы Person", () => {test ("он отклоняет, когда url не является строкой", async () => {hope.assertions (1); const valentinogagliardi = new Person ("valentinogagliardi"); await Ожидайте (valentinogagliardi.getData ()). rejects.toEqual (TypeError ("url должен быть строкой"));});});

Мы должны проверить не простое исключение, а отклонение с помощью TypeError.

Сейчас тест проходит:

PASS test / index.test.js Персональные методы ✓ отвергает, когда url не является строкой

А как насчет кода?

Чтобы поймать ошибку, вы должны выполнить рефакторинг следующим образом:

const Person = require ("../ index"); const valentinogagliardi = новый человек ("valentinogagliardi"); valentinogagliardi .getData () .then (res => res) .catch (err => console.error (err));

Теперь исключение будет отображаться в консоли:

TypeError: url должен быть строкой в ​​Person.getData (/home/valentino/Documenti/articles-and-broadcasts/throw-from-async-functions-2018-04-02/index.js:12:13) в Object. <anonymous> (/home/valentino/Documenti/articles-and-broadcasts/throw-from-async-functions-2018-04-02/index.js:22:4) // ...

Важно отметить, что если вам нравится больше попробовать / поймать.

Следующий код не поймает ошибку:

const Person = require ("../ index"); асинхронная функция, что угодно () {try {const valentinogagliardi = new Person ("valentinogagliardi"); await valentinogagliardi.getData (); // делать вещи с возможным результатом и что-то возвращать} catch (error) {throw Error (error); } } без разницы();

Помните: отклоненное обещание будет распространяться в стеке, если вы его не поймаете .

Чтобы правильно отловить ошибку в try / catch, вы должны выполнить рефакторинг следующим образом:

асинхронная функция, что угодно () {try {const valentinogagliardi = new Person ("valentinogagliardi"); await valentinogagliardi.getData (); // делать вещи с возможным результатом и что-то возвращать} catch (error) {throw Error (error); }} what (). catch (err => console.error (err));

Вот как это работает.

Как сгенерировать ошибки из асинхронных функций в Javascript: завершение

Подведем итог:

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

Чтобы перехватывать исключения из асинхронных функций, вы должны использовать catch () .

А вот правила тестирования исключений в Jest :

  • использование assert.throws для тестирования исключений в обычных функциях и методах
  • использование ожидать + отклоняет для тестирования исключений в асинхронных функциях и асинхронных методах

Спасибо за чтение и следите за обновлениями в этом блоге!

Я Валентино Гальярди, и я помогаю занятым людям освоить этот безумный современный JavaScript-материал. Я занимаюсь обучением и консультированием по JavaScript, React, Redux.

Давайте свяжемся!

Новости

Социальные сети в России, зима 2015-2016 Цифры, тренды, прогнозы | Блог Brand Analуtics — все о бренд мониторинге и социальной аналитике
Представляем данные регулярного исследования активной аудитории социальных сетей в России, зима 2015-2016. В исследовании представлены данные по аудитории, возрасту, полу и региональному распределению

SMM маркетинг от А до Я
Развитие социальных сетей породило новую огромную бизнес отрасль — СММ маркетинг. Это когда мы приходим с нашим продуктом в какую-нибудь соцсеть, находим там нашу целевую аудиторию, и предлагаем ей наш

Полезно знать
20.02.2014 Что такое Pinterest. Визуальный PR и маркетинг Pinterest или ПИНТЕРЕСТ – социальная сеть, использующая вместо текстов картинки и изображения, которые можно добавлять в аккаунт,

Фейсбук Моя страница: ВХОД на свою страницу Facebook
Фейсбук (Facebook) Моя страница — это личная страница каждого зарегистрированного пользователя самой большой в мире социальной сети.  Фейсбук даёт возможность людям с разных уголков Земли общаться между

Анализ социальных сетей
АНАЛИЗ СОЦИАЛЬНЫХ СЕТЕЙ (social network analysis) - новое направление структурного подхода, основными целями которого являются исследование взаимодействий между социальными объектами и выявление условий

Социальные сети для продвижения бизнеса: какие выбрать?
  Привет, друзья! Социальные сети занимают львиную часть времени в нашей жизни. Ежедневный просмотр новостей, любимых групп и переписка с друзьями – это любимое дело большинства молодых людей. Вот и

ВРЕДНОЕ ВЛИЯНИЕ СОЦИАЛЬНЫХ СЕТЕЙ НА ЗДОРОВЬЕ ЧЕЛОВЕКА - VI Студенческий научный форум (15 февраля - 31 марта 2014 года)
ВРЕДНОЕ ВЛИЯНИЕ СОЦИАЛЬНЫХ СЕТЕЙ НА ЗДОРОВЬЕ ЧЕЛОВЕКА Гущина Н. В., Люлина Н.В. С распространением всемирной паутины рост социальных сетей по всему миру стал глобальным явлением. С каждым

Влияние социальных сетей на подростков. Пропаганда суицида в сетях
Почему мы любим интернет? Почему молодым людям, подросткам сказать «Привет» стало проще, познакомившись в интернете, чем просто подойти в реальности? Почему все «сидят» в социальных сетях? Социальные сети

Маркетинг в социальных сетях (SMM) для продвижения компании
Деятельность в социальных сетях, на блогах и форумах по повышению лояльности клиентов получила название SMM — от аббревиатуры английского звучания этого термина – Social Media Marketing. Аудитория

Фейсбук (Facebook) - что это за сеть: как пользоваться ФБ
Фейсбук — это самая популярная и большая социальная сеть в мире. Если Вам интересно узнать больше о Facebook, про то как пользоваться сетью и о некоторых «фишках» ФБ — этот материал именно для вас!