2016-11-16 5 views
0

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

try 
{ 
    //Code that might throw an exception 
} 
//Catch exceptions to be handled in this context 
catch (Exception ex) when (!IsExcludedException(ex)) 
{ 
    //Handle leftover exceptions 
} 

Или было бы лучше :

try 
{ 
    //Code that might throw an exception 
} 
catch (SpecificException) 
{ 
    throw; 
} 
//Catch exceptions to be handled in this context 
catch (Exception ex) 
{ 
    //Handle leftover exceptions 
} 

Или это не имеет значения? Есть ли способ лучше?

+0

Вы никогда не узнаете, какие исключения происходят, и вы не сможете их обработать. Как насчет OutOfMemoryException? –

+1

Это кажется довольно необычным. Обычно вы делаете наоборот. Но вы говорите: «Я знаю об этой ошибке, но я не могу справиться с этим. Но я могу справиться с чем угодно! ' – Jonesopolis

+0

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

ответ

3

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

+5

Вы видите, что больше всего потому, что другой способ очень новый. Люди не могли реализовать его в течение длительного времени. –

+0

Тем не менее, вам нужно будет делать 'when (! (Ex is OneSpecificException || ex is OtherSpecificException || ex is SomeOtherSpecificException)' – Qrchack

+0

@Qrchack Это можно легко обернуть в метод, который , если их правильно назвать, будет столь же ясным. – Kyle