Nano Hash - криптовалюты, майнинг, программирование

Почему исключение не перехвачено предложением catch моего обещания?

У меня есть этот код, я надеюсь перехватить все исключения во время этого асинхронного метода. Каким-то образом произошло исключение URL-адреса, но оно не было перехвачено предложением catch. Я должен добавить вокруг него блок try-catch, чтобы поймать это исключение, не знаю почему, может кто-нибудь объяснить?

public async transform(
  ): Promise {
   const {result} = this.processUrl(url).catch(error => error);
   return result;
}


private processUrl(url: string): Promise {
  const targetHostname = new URL(url).hostname; // exception thrown here invalid url something
  // do something else ...
  return Promise.resolve(targetHostname);
}

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

public async transform(
  ): Promise {
try {
   const {result} = this.processUrl(url).catch(error => error);
} catch(e) {
    // invalid url exception got caught
    return Promise.resolve(undefined);
}
   return result;
}

Ответы:


1

processURL() не является async функцией. Таким образом, он не возвращает обещание автоматически и не перехватывает автоматически исключения и не превращает их в отклоненное обещание.

Итак, если где-нибудь в processURL() генерируется исключение, это исключение просто распространяется вверх как синхронное исключение. Если вы хотите самостоятельно перехватить это синхронное исключение, вам понадобится команда try / catch, чтобы перехватить его.

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

private async processUrl(url: string): Promise {
  const targetHostname = new URL(url).hostname; // exception thrown here invalid url something
  // do something else ...
  return Promise.resolve(targetHostname);
}

Или вы можете поймать это вручную:

private processUrl(url: string): Promise {
  try {
      const targetHostname = new URL(url).hostname; // exception thrown here invalid url something
      // do something else ...
      return Promise.resolve(targetHostname);
  } catch(e) {
      return Promise.reject(e);
  }
}

У вас также может быть проблема:

const {result} = this.processUrl(url).catch(error => error);

Потому что ваша функция processUrl() настроена на возврат обещания. Вам нужно использовать .then() или await, чтобы получить значение из этого обещания. К вашему сведению, если processUrl() на самом деле полностью синхронный, то заставить его возвращать обещание, когда он может просто вернуть значение напрямую, просто усложняет ситуацию.

06.11.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..