A function should throw an exception when it is not able to fulfil its promise.
As soon as the function detects a problem that prevents it from fulfilling its promise, it should throw an exception. If the function is able to handle the problem, recover itself and deliver the promise, the exception should not be thrown.
If an event happens very frequently then exception handling is not the best way to deal with it. It requires proper fixation.