2015-07-28 3 views
-5

Итак, я думал, что цель блока finally состояла в том, чтобы убедиться, что выполнялись какие-либо операторы независимо от того, была ли выполнена ошибка, но при дальнейшем чтении я обнаруживаю, что finally не будет выполняться, если ошибка не обрабатывается. Так в чем же смысл finally, если он не выполняется? Разве не было бы более функциональным только иметь catch(exception e), который выполняет инструкции, а затем повторяет ошибку, потому что тогда вы, по крайней мере, знаете, что то, что должно было быть выполнено, было выполнено?Какая точка окончательного блока

Этот код является то, что меня беспокоит:

private void ASLogoff_Click(object sender, RoutedEventArgs e) 
     { 
      MainWindow MW = new MainWindow(); 
      try { MW.Show(); }// This throws an InvalidOperationException 
      finally{ Close(); }//This code never executes 

     } 

Главное окно закроется сама, если определенные условия бросали ошибку, и я хочу близко заявление работать, даже если это произойдет. MW.Show() выдает исключение InvalidOperationException, которое прерывает программу, а не выполняет оператор finally.

public MainWindow() 
    { 
     dm = new DataMover(); 
     InitializeComponent(); 
     if (DataMover.store.flagp||!DataMover.store.areAdmin()) 
     { 
      NewAdminScreen nas = new NewAdminScreen(); 
      nas.Show(); 
      Close(); 
     } 
    } 
+0

Сделайте это, когда вы полностью выполнили все_, ** с ошибкой или без ошибок **. :-) –

+7

«Я обнаружил, что, наконец, не выполнится, если ошибка была необработанной» - да, это будет. (За исключением редких, катастрофических обстоятельств (переполнение стека, процесс убит и т. Д.) –

+1

try {askQuestion(); } catch {downVotes(); } finally {closeTopic(); } –

ответ

2

https://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx объясняет это очень хорошо:

Используя наконец блок, вы можете очистить любые ресурсы, которые выделены в Ьгу блоке, и вы можете запустить код, даже если исключение происходит в блоке try. Как правило, инструкции блока finally запускаются, когда элемент управления оставляет оператор try. Передача управления может произойти в результате нормального выполнения, выполнения разрыва, continue, goto или return statement или распространения исключения из инструкции try.

Так что finally используется для выполнения кода в блоке, который вы всегда хотите запустить, независимо от того, выбрано ли исключение в блоке try.

Смежные вопросы