Итак, я думал, что цель блока 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();
}
}
Сделайте это, когда вы полностью выполнили все_, ** с ошибкой или без ошибок **. :-) –
«Я обнаружил, что, наконец, не выполнится, если ошибка была необработанной» - да, это будет. (За исключением редких, катастрофических обстоятельств (переполнение стека, процесс убит и т. Д.) –
try {askQuestion(); } catch {downVotes(); } finally {closeTopic(); } –