Exceptions should be derived from the System.Exception, but are not required to do so.
If no catch block is found for an exception, and the source is not a static constructor, a System.ThreadException will be thrown
Mathematical errors such as divide by zero, or numeric overflow will generate an exception that is derived from System.Exception
Every throw statement must have at least one catch block
Useful resources, Exception