Должны ли вы поймать все исключения?

Это не "Как поймать все исключения", а "Если вы поймаете все исключения"? В С#.NET я заметил огромное количество исключений. Целесообразно ли планировать ловить любое исключение?

Например, конструктор DirectoryInfo() генерирует 4 исключения. Должен ли я планировать ловить эти или только поймать те, с которыми я могу справиться? Может быть, пусть другие пузырятся до Main(), где у меня есть все, что потом говорит пользователю, что есть неперехваченное исключение. Кажется, что все эти исключения исключают, что ваш код может стать более обработанным, чем фактический код.

Ответ 1

Используйте только те, которые имеют смысл обрабатывать уровень абстракции, при котором вы пишете код. Большинство исключений можно будет поймать на гораздо более высоком уровне, чем там, где их бросают.

Итак, вы правы.:)

Ответ 2

Вы должны перехватывать исключения, которые вы ожидаете, - и изящно излагать исключения, которые вы не ожидаете (улавливая их в общем обработчике исключений).

В вашем примере - создание DirectoryInfo() может вызывать множество исключений - но нет причин, по которым вы не можете просто

try 
{ 
   var di = new DirectoryInfo(somePath);
}
catch(Exception ex)  
{
   // Messagebox/alert the user etc, gracefully exit/cancel/throw if needed
}

Возможно, вы хотите поймать исключение безопасности и предоставить какой-то другой код, хорошо сделайте это, но сохраните обработчик "общего дела"

try 
{ 
   var di = new DirectoryInfo(somePath);
}
catch(SecurityException ex) 
{
   // Carry on but use a default path or something etc
}
catch(Exception ex)  
{
   // Messagebox/alert the user etc, gracefully exit/cancel
}

Ответ 3

Как правило, вы должны использовать только исключения, которые вы знаете, как обращаться. Целью буферизации исключений является то, что другие части кода поймают их, если они смогут их обрабатывать, поэтому улавливание всех исключений на одном уровне, вероятно, не даст вам желаемого результата.

На верхнем уровне вы можете захотеть, чтобы у вас было все, чтобы дать пользователю дружественное сообщение об ошибке, и это будет означать, что ваша программа неправильно обрабатывает что-то, и вам может понадобиться выяснить, как с ней справиться должным образом.

Есть некоторые случаи (например, OutOfMemoryException), что на самом деле нет способа изящно обрабатывать (кроме выхода), и вы должны определенно позволить этим пузырям, по крайней мере, до пользовательского интерфейса для изящного выхода.

Ответ 4

Просто поймите те, которые вы можете и хотите обработать.
Логика довольно проста, что вы будете делать с остальными "бросками"?
если есть что-то (логика\протоколирование\сообщение об ошибках), которое вы хотите сделать, и вы просто собираетесь перебросить, тогда у вас нет причин ловить.