Your stack trace tells you
where in the code the error occurred, but doesn't tell you
what it was doing with what data. For that you need to pass context for the error up the chain of calls, adding to it as you go up. Exceptions are not a great way of doing it as you only have the local context, which isn't a great help when you're catching N levels up.
And if you're not catching N levels up but catching at each level, then you are emulating error values but with try/catch blocks.