For the most part this is bad practice. There are a small number of exceptions that you must reuse (InvalidOperation, NullReference, ArgumentException, several others). But you should not, for example, throw SqlException yourself, because you do not know what the infrastructure can do with it.
Creating your own exception hierarchy adds value to your application at times of error. Reusing exceptions that have already understood the meaning leads to confusion - a loss of meaning.
source share