Почему не пойманная в Promise.all ошибка не попадает в catch?

Когда вы используете Promise.all для выполнения нескольких промисов параллельно, каждый из этих промисов выполняется независимо друг от друга. Если один из промисов завершится с ошибкой, он будет "выбрасывать" исключение, но это исключение не будет перехвачено непосредственно в catch блоке Promise.all.

Это происходит потому, что Promise.all создает новый промис, который будет разрешен, только когда все промисы, переданные в Promise.all, завершатся (успешно или с ошибкой). Если хотя бы один промис завершится с ошибкой (то есть будет выброшено исключение), родительский промис, созданный Promise.all, тоже завершится с ошибкой. Но исключение отдельного промиса не попадет непосредственно в блок catch, так как Promise.all обрабатывает эти исключения внутри себя, чтобы правильно отслеживать состояние всех промисов.

Если вы хотите иметь возможность перехватить ошибку отдельного промиса, который передается в Promise.all, вам нужно использовать обработку ошибок для каждого из промисов до того, как вы объедините их в Promise.all.

Пример:

const promise1 = new Promise((resolve, reject) => {
  reject('Ошибка!');
});

const promise2 = new Promise((resolve, reject) => {
  resolve('Успех!');
});

Promise.all([promise1.catch(error => { console.error(error); }), promise2.catch(error => { console.error(error); })])
  .then(results => {
    console.log(results);
  })
  .catch(error => {
    console.error('Ошибка в Promise.all:', error);
  });

В этом примере мы добавили обработчики ошибок для каждого из промисов перед созданием Promise.all, чтобы перехватить ошибки отдельных промисов. В конечном итоге, если хотя бы один из промисов завершится с ошибкой, родительский промис Promise.all также завершится с ошибкой, и мы сможем перехватить эту ошибку в блоке catch на последнем уровне.