Почему использование наконец в C#?

Вы можете объединить массивы с помощью +, построить новый массив

let c = a + b
print(c) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]

или добавить один массив к другому с помощью += (или append):

a += b

// Or:
a.append(contentsOf: b)  // Swift 3
a.appendContentsOf(b)    // Swift 2
a.extend(b)              // Swift 1.2

print(a) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
183
задан Rodrigo 13 February 2009 в 21:36
поделиться

10 ответов

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

Теперь, я предположение , Ваш вопрос состоит в том, почему необходимо сделать это:

try
{
    doSomething();
}
catch
{
    catchSomething();
}
finally
{
    alwaysDoThis();
}

, Когда можно сделать это:

try
{
    doSomething();
}
catch
{
    catchSomething();
}

alwaysDoThis();

ответ - то, что много времен код в Вашем операторе выгоды или повторно бросит исключение или убежит из текущей функции. С последним кодом, "alwaysDoThis ()"; вызов не выполнится, если код в операторе выгоды выпустит возврат или выдаст новое исключение.

392
ответ дан Kevin Pang 4 November 2019 в 15:35
поделиться

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

try
{
    // Code here that might throw an exception...

    if (arbitraryCondition)
    {
        return true;
    }

    // Code here that might throw an exception...
}
finally
{
    // Code here gets executed regardless of whether "return true;" was called within the try block (i.e. regardless of the value of arbitraryCondition).
}

Это поведение делает это очень полезным в различных ситуациях, особенно когда необходимо выполнить, очистка (расположите ресурсы), хотя использование блок часто лучше в этом случае.

60
ответ дан Noldorin 4 November 2019 в 15:35
поделиться

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

 SqlConnection myConn = new SqlConnection("Connectionstring");
        try
        {
            myConn.Open();
            //make na DB Request                
        }
        catch (Exception DBException)
        {
            //do somehting with exception
        }
        finally
        {
           myConn.Close();
           myConn.Dispose();
        }

, если Вы не хотите фиксировать ошибку, затем используют

 using (SqlConnection myConn = new SqlConnection("Connectionstring"))
        {
            myConn.Open();
            //make na DB Request
            myConn.Close();
        }

, и от объекта соединения избавятся автоматически, если будет ошибка, но Вы не фиксируете ошибку

11
ответ дан Bob The Janitor 4 November 2019 в 15:35
поделиться

Поскольку наконец будет выполняться, даже если Вы не обработаете исключение в блоке выгоды.

10
ответ дан Matt Briggs 4 November 2019 в 15:35
поделиться

Иногда Вы не хотите обрабатывать исключение (никакой блок выгоды), но Вы хотите, чтобы некоторый код очистки выполнился.

, Например:

try
{
    // exception (or not)
}
finally
{
    // clean up always
}
2
ответ дан markom 4 November 2019 в 15:35
поделиться

Ahh... Я думаю, что вижу то, что Вы говорите! Взял меня секунда... Вы задаетесь вопросом "почему место она в наконец блок вместо после наконец блок и полностью вне try-catch-finally".

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

1
ответ дан Beska 4 November 2019 в 15:35
поделиться

Скажите, что необходимо задержать курсор к указателю по умолчанию вместо ожидающего (песочные часы) курсор. Если исключение выдается прежде, чем установить курсор и напрямую не разрушает приложение, Вас можно было оставить с запутывающим курсором.

2
ответ дан Chris Doggett 4 November 2019 в 15:35
поделиться

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

2
ответ дан cgreeno 4 November 2019 в 15:35
поделиться

finally, как в:

try {
  // do something risky
} catch (Exception ex) {
  // handle an exception
} finally {
  // do any required cleanup
}

гарантируемая возможность выполнить код после Вашего try..catch блок, независимо от того, выдал ли Ваш блок попытки исключение.

, Который делает это идеально подходящим для вещей как высвобождение средств, соединений дб, дескрипторов файлов, и т.д.

7
ответ дан NikolayKondratyev 4 November 2019 в 15:35
поделиться

Как упомянуто в документации :

Обычное использование вылова и, наконец, вместе - получение и использование ресурсов в блоке try, работа с исключительными обстоятельствами при вылове и освободить ресурсы в блоке finally.

Стоит также прочитать этот , в котором говорится:

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

Таким образом, ясно, что код, который находится в предложении finally, будет выполнен, даже если в предыдущем предложении catch был оператор return.

0
ответ дан 23 November 2019 в 06:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: