The reasons are:
1- You better have more specific exception types in order to handle different scenarios more efficiently. Imagine you wish your class to take different actions for each type of exceptions.
2- It is easy-to-read for your other coleagues; It'll be easier to maintain for the next poor guy debugging your code. {Sun estimates that over the lifetime of a standard piece of code, 20 percent of the effort will go into the original creation and
testing of the code, and 80 percent of the effort will go into the subsequent maintenance and enhancement of the code.}
3- It has just the same nature as the case to have a general class doing various sort of stuff by having hundreds of methods (just like structured programming languages) instead of having classes doing that class-specific jobs which are high cohesion ones. That's the reason you might define your own user-specific exception classes.
Conclusion: writing a code working just fine is NOT the whole idea, writing a code presenting your good style applying good OO
patterns is the best practice.
Cheers
Parham