Как уже говорили другие, вы должны предполагать, что каждая строка кода может выдать исключение, если вы не доказали, что это не может. Лучший вопрос: «Что вы планируете делать с этим?»
В общем, вы не должны ловить никаких исключений вообще.
Конечно, все остальное является исключением из этого правила. Имеет смысл перехватить исключение, чтобы зарегистрировать его (если ваша среда не делает этого за вас, как это делает ASP.NET). Имеет смысл перехватить исключение, чтобы заменить его другим исключением, которое предоставляет более подробную информацию о контексте:
public int GetConfiguredInteger(string name) {
string s = null;
try {
s = GetStringFromConfigFile(name);
}
catch (IOException ex) {
throw new Exception(String.Format(
"Error in configuration file foo.config when processing {0}", name),
ex);
}
return int.Parse(s);
}
Вызывающий не мог знать, что IOException было вызвано файлом конфигурации, если вы не сказали им. Обратите внимание также, как я игнорировал все исключения, не связанные с файловым вводом / выводом. В частности, обратите внимание, что int.Parse даже не находится внутри блока try / catch.
Существует небольшое количество других подобных исключений, но основная идея перехвата исключений такова: не делайте этого, если только это не будет хуже.