2012-06-25 5 views
10

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

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

+0

http://stackoverflow.com/questions/1454266/net-catch-general-exceptions http://stackoverflow.com/questions/1742940/why-not-catch-general-exceptions –

+4

Лично я использую 'finally 'a ** lot ** больше, чем я когда-либо использовал' catch' –

+2

@marc: Это причина, по которой я не мог открыть вопросы несколько минут назад? ;) –

ответ

14

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

Так что да, вы правы. :)

+3

Это. Только обрабатывайте исключения, которые вы можете обрабатывать. – hometoast

0

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

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

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

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 
} 
0

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