IMO Exceptions are only obtained when you can't do anything about it. E.g. if i wrote a wrong SQL I should get an error because a can fix it as a programmer. Usually we write the whole stack of code in MVC like patterns, so we have control over every layer. In that case I won't use Exceptions, because i'm fully in control over every layer.
I think an exception should only be used when you can't influence the code that tells something went wrong. But from that "read-only" code point of view something needs to be reported because something unexpected happened. So what i CAN influence is its following behaviour after the exceptions (because I can catch it right?). From that point I can still generate an error or give a message or do something else. So the programmer is still in control
That implies using Exceptions is almost always used in API's and components. In little isolated islands of independant code. In that case you write software for other programmers. You can still report something went wrong but leave it to those who implement your code what to do with it.