Есть два типа исключений:
System.Exception - это базовый класс исключений в системе. Различные другие классы исключений наследуються из этого базового типа. Исключения могут быть и сгенерированы самим программистом, тогда они должны наследоваться от ApplicationException.
На данный момент использование исключений для обработки нестандартных ситуаций внутри самой программы стало обычной практикой, это лучше чем изучать возврат функций или глобальные флаги. Смотрим пример:
using System; class MyException : ApplicationException { } class MainClass { public static void Main(string[] args) { try { throw new MyException(); } catch(MyException e) { Console.WriteLine("My exception {0}",e); } } }
Мы создали свое исключение MyException как наследник от ApplicationException и при нестандартной ситуации вызываем throw, который и генерирует исключение.