Все ветви кода, которые приводят к генерации исключений, должны предоставлять метод проверки успешного выполнения, не генерирующий исключения. Например, чтобы устранить исключение FileNotFoundException, можно вызвать File.Exists. Данный подход всегда возможен, но его целью является отсутствие генерации исключений при нормальном выполнении.
...
Не следует использовать исключения для обычных или ожидаемых ошибок или для обычного потока управления.
Для наиболее общих часто встречающихся ошибок следует возвращать пустое значение. Например, команда File.Open возвращает пустую ссылку, если файл не найден, но создает исключение, если он заблокирован.
Разрабатывать классы следует таким образом, чтобы при обычном процессе использования исключения никогда не возникали. В следующем примере кода класс FileStream предоставляет еще один способ определить, достигнут ли конец файла, чтобы избежать возникновения исключения, которое генерируется, если разработчик попытается осуществить чтение за концом файла.