Конечно, есть обстоятельства, когда можно поймать конкретное исключение и ничего не делать. Вот тривиальный пример:
public FileStream OpenFile(string path)
{
FileStream f = null;
try
{
f = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
}
catch (FileNotFoundException)
{
}
return f;
}
Вы также можете написать метод так:
public FileStream OpenFile(string path)
{
FileStream f = null;
FileInfo fi = new FileInfo(path);
if (fi.Exists)
{
f = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
}
return f;
}
В этом случае перехват исключения (очень) незначительно безопаснее, поскольку файл может быть удален между временем проверки его существования и временем его открытия.
Есть причины , а не , чтобы сделать это, конечно. В .NET исключения являются вычислительно дорогими, поэтому вы хотите избегать всего, что их выбрасывает. (В Python, где исключения дешевы, обычно используют исключения для таких вещей, как вырывание циклов.)
Но это игнорирует специфическое исключение. Этот код:
catch
{
}
непростительно.
Нет веской причины не отлавливать конкретное типизированное исключение, которое будет выдавать код в блоке try
. Первая причина, которую наивный разработчик приводит для перехвата исключений независимо от типа: «Но я не знаю, какой тип исключения может быть выдан» - это своего рода ответ на вопрос.
Если вы не знаете, какой тип исключения может быть сгенерирован, вы не знаете, как ваш код может дать сбой. Если вы не знаете, как может произойти сбой вашего кода, у вас нет оснований предполагать, что все в порядке, просто продолжайте обработку, если это произойдет.