Chrome Dev Tools останавливается на отклоненном обещании, хотя я его ловлю - PullRequest
0 голосов
/ 20 февраля 2020

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

function testExc(url: string): Promise<GLTF | undefined> {
    try {
        const promise: Promise<GLTF> = new Promise((resolve, reject) => {
            throw Error('hi')
        })
        promise.catch((err) => { console.log(`Caught ${err}`) })
        return promise
    } catch (e) {
        return Promise.resolve()
    }
}

, которая, к моему удивлению, вызывает «Приостановлено при отклонении обещания» в Chrome Инструменты разработчика на throw строка. У меня включен режим «Приостановить исключения» и «Приостановить обнаруженные исключения», потому что я хочу знать о неисследованных исключениях.

Почему происходит пауза? Я ловлю исключения двумя способами: с .catch и try/catch вокруг всего этого. Когда я продолжаю, .catch строфа ловит его, как и ожидалось.

Я использую Chrome 80.0.3987.116 на Windows 10, с машинописным текстом 3.7.

Транспортированный JS код выглядит так, если это полезно:

function testExc(url) {
  try {
    const promise = new Promise((resolve, reject) => {
      throw Error('hi');
      resolve(undefined);
    });
    promise.catch(err => {console.log(`Caught ${err}`);});
    return promise;
  }
  catch (e) {
    return Promise.resolve(undefined);
  }
}

1 Ответ

1 голос
/ 20 февраля 2020

Эта проблема была поднята в 2015 году как отчет об ошибке для хрома. Вот некоторые соответствующие утверждения, которые я вижу в обсуждении:

Обратный вызов конструктора вызывается синхронно перед выполнением кода ".catch ()", поэтому в момент, когда генерируется исключение, оно действительно неучтенный. Позже это становится пойманным ... (aandrey@chromium.org)

Область действия Try-catch - stati c. Во время броска мы знаем, что его поймают. (yangguo@chromium.org)

В тот момент, когда реализация обещания проверяет и вызывает обработчик отклонения, может быть намного позже. Тем не менее, семантика DevTools требует прерывания на сайте броска, чтобы иметь смысл «разрыв по исключению». (yangguo@chromium.org)

Так что я предполагаю, что обсуждаемый нами сценарий - это случай, когда Promise отклоняется в конструкторе ... В этом случае еще нет возможности присоединить обработчик отклонения. (yangguo@chromium.org)

Короче говоря, когда вы бросаете ошибку в конструктор обещания, devtools трудно определить, что оно обрабатывается позже.

Вместо этого обработайте его внутри вашего конструктора:

function testExc(url) {
  return new Promise((resolve, reject) => {
    try {
      throw new Error('hi');
    }
    catch (e) {
      console.log(`Caught ${e}`);
      resolve();
    }
  })
}
...