Как уже было сказано, используйте их только для исключительных ситуаций.
Всегда предоставляйте пользователю способ избежать исключения, например. если у вас есть метод, он выдаст, если что-то пойдет не так, как это:
public void DoSomethingWithFile() {
if(!File.Exists(..))
throw new FileNotFoundException();
}
Предоставьте пользователю другой метод для вызова:
public bool CanDoSomething() {
return File.Exists(..);
}
Таким образом, вызывающий абонент может избегать исключений, если хочет.
Не стесняйтесь бросать, если что-то не так - «быстро провалиться», но всегда указывайте путь без исключений.
Также сохраняйте иерархию классов исключений плоской и взгляните на стандартные исключения, такие как InvalidStateException и ArgumentNullExcpetion.