This is sort of a design question. I have multiple exceptions that my code base may throw. Currently I have them named based on why they where thrown using System.Exception as the base class.

The downside of this is multiple casts need to be performed or multiple catches in order for this to work. My other option is error codes, this means I have on general exception which passes a string that would be a code of sorts for each given exception

What are all your thoughts on these two options.