Promises também tornam o tratamento de erros de forma elegante com o uso do método catch.
.catch()
Imagine que você está usando o método .fetch() de uma biblioteca que faz o GET para pegar o HTML de uma página. Esse método retorna uma promise e é possível que ela seja rejeitada caso aconteça um erro (como não encontrar a página web por problemas de conexão etc).
someLib.fetch("https://url.com")
.then(return something)
.then(return somethingAgain)
.catch(error => console.error(error) // Lida com qualquer erro do fetch ou do primeiro/segundo then
.then(return anotherSometing) // O catch de cima não pode lidar com o erro desse then
.catch((error) => console.error(error)) // Lida com erro do then de cima