While chaining promises (without async/await) there is also the focus on the happy path.
Don’t know if you handle it in another way?
let result = promise->then()->then()->then()->catch()
Exceptions would solve the problem, but never thought about using exceptions instead of options for example
And as you mentioned: You have to use another tool to track them.