Eric Gunnerson says:
One way to determine this is to ask yourself, "Self, would a user ever care about the different cases where ApplicationException is thrown?" In some cases this is obvious, but in other cases, it's not quite so clear. My recommendation is that you err on the side of more granularity rather than less granularity.
Absolutely. The try/catch block is the most abused construct in any language that supports SEH. I write a lot of libraries, so I rarely catch exceptions. Many times, I want them to bubble up and out. If bubbling that exception will not give the user enough detail, I'll wrap it in a my own ApplicationExceptioin subclass.
Just be sure when you throw those custom exceptions, you don't break the Law of Leaky Abstractions
[Listening To: - Operation Ivy - Bad Town]