Я пришел сюда в поисках ответа на оригинальный пост и почти пропустил очень ценный ответ, опубликованный Эриком Липпертом . Вот его ответ в комментариях:
Разделите это на три вопроса.
(1) Будет ли выполнен какой-либо код в методе после броска?
ДА. Если исключение было внутри try, то будет выполнен код внутри соответствующих блоков catch или finally. Если нет блока try, тогда NO. Элемент управления переходит к ближайшему включающему фильтру finally, catch или (в vb) исключения в стеке.
(2) Должен ли я сделать перерыв после броска?
НЕТ, никогда не делай этого. Конечная точка оператора throw недоступна; бросок обрабатывается компилятором как переход. Оператор, следующий сразу за броском, недоступен и никогда не будет выполнен.
(3) Бросок всегда выходит из метода?
NO. Если бросок находится в попытке, и попытка имеет соответствующий блок catch, тогда блок catch может «съесть» исключение. Только если нет блока catch, исключение делает нелокальный переход к стеку вызовов.
Если у вас есть дополнительные вопросы по этому поводу, я рекомендую прочитать спецификацию C #; все это поведение четко задокументировано.
Наконец, звучит так, как будто вы выкидываете исключения с "головокружением", как, например, в "эй, звонивший с головой", я сказал вам никогда не давать мне эти данные ". Это здорово, потому что это предотвращает ошибки в звонящих. Но если вы сделаете это, вы должны убедиться, что у звонящего есть способ узнать, чего вы ожидаете! Если вызывающий не может выяснить, собираетесь ли вы бросить или нет, основываясь на вашей документации, то вы не сделали исключение без головы, вы сделали неприятное исключение. Подробнее см. http://blogs.msdn.com/ericlippert/archive/2008/09/10/vexing-exceptions.aspx.