Another thing to keep in mind is that exceptions are pretty expensive things to be throwing around. Conditions that you can anticipate and test for are generally better handled by testing for them deliberately, and leave using exceptions for exceptional cases that actually cause the method to break down.
On the other hand, throwing an exception is often convenient because without them you have to have some other way to indicate an error condition (the way so many of PHP's functions return false on failure, even though it might return 0 on success, suggests why this can be a good thing) and you have to deal with that error condition in every piece of code that uses the function's result (whereas exceptions can just keep bubbling up through the call stack until it is caught).
A routine that opens a file, appends to it, and closes it again would have a try{} block around the file-handling lines, because there are several (more than three) ways in which the code can fail, some of which are outside your control (e.g., even if you check to see that the file exists before opening it, someone else might delete the file during the instant between the check and the actual opening). On top of that, doing all the filesystem checks would end up being slower than just making the attempt and throwing the exception in event of failure.