Вы можете объединить массивы с помощью +
, построить новый массив
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]
Код в наконец блок будет выполняться независимо от того, существует ли исключение. Это входит очень удобное когда дело доходит до определенных функций обслуживания, которые необходимо всегда выполнять как заключительные соединения.
Теперь, я предположение , Ваш вопрос состоит в том, почему необходимо сделать это:
try
{
doSomething();
}
catch
{
catchSomething();
}
finally
{
alwaysDoThis();
}
, Когда можно сделать это:
try
{
doSomething();
}
catch
{
catchSomething();
}
alwaysDoThis();
ответ - то, что много времен код в Вашем операторе выгоды или повторно бросит исключение или убежит из текущей функции. С последним кодом, "alwaysDoThis ()"; вызов не выполнится, если код в операторе выгоды выпустит возврат или выдаст новое исключение.
На большинство преимуществ использования попытки наконец уже указали, но я думал, что добавлю этого:
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).
}
Это поведение делает это очень полезным в различных ситуациях, особенно когда необходимо выполнить, очистка (расположите ресурсы), хотя использование блок часто лучше в этом случае.
любое время Вы используете неуправляемые запросы кода как потоковые читатели, запросы дб, и т.д.; и Вы хотите поймать исключение, затем используют выгоду попытки наконец и закрывают поток, средство чтения данных, и т.д. в наконец, если Вы не делаете, когда это ошибки, соединение не становится закрытым, это действительно плохо с запросами дб
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();
}
, и от объекта соединения избавятся автоматически, если будет ошибка, но Вы не фиксируете ошибку
Поскольку наконец будет выполняться, даже если Вы не обработаете исключение в блоке выгоды.
Иногда Вы не хотите обрабатывать исключение (никакой блок выгоды), но Вы хотите, чтобы некоторый код очистки выполнился.
, Например:
try
{
// exception (or not)
}
finally
{
// clean up always
}
Ahh... Я думаю, что вижу то, что Вы говорите! Взял меня секунда... Вы задаетесь вопросом "почему место она в наконец блок вместо после наконец блок и полностью вне try-catch-finally".
Как пример, это могло бы быть, потому что Вы останавливаете выполнение, если Вы бросаете ошибку, но Вы все еще хотите очистить ресурсы, такие как открытые файлы, соединения с базой данных, и т.д.
Скажите, что необходимо задержать курсор к указателю по умолчанию вместо ожидающего (песочные часы) курсор. Если исключение выдается прежде, чем установить курсор и напрямую не разрушает приложение, Вас можно было оставить с запутывающим курсором.
наконец блок ценен для чистки любых ресурсов, выделенных в блоке попытки, а также выполнении любого кода, который должен выполниться, даже если существует исключение. Управление всегда передается к наконец блок независимо от того, как блок попытки выходит.
finally
, как в:
try {
// do something risky
} catch (Exception ex) {
// handle an exception
} finally {
// do any required cleanup
}
гарантируемая возможность выполнить код после Вашего try..catch
блок, независимо от того, выдал ли Ваш блок попытки исключение.
, Который делает это идеально подходящим для вещей как высвобождение средств, соединений дб, дескрипторов файлов, и т.д.
Как упомянуто в документации :
Обычное использование вылова и, наконец, вместе - получение и использование ресурсов в блоке try, работа с исключительными обстоятельствами при вылове и освободить ресурсы в блоке finally.
Стоит также прочитать этот , в котором говорится:
Как только найдено соответствующее предложение улова, система готовится передать управление первому оператору пункт поймать. Перед началом выполнения предложения catch система сначала выполняет по порядку все предложения finally, которые были связаны с операторами try, более вложенными, чем те, которые перехватили исключение.
Таким образом, ясно, что код, который находится в предложении finally
, будет выполнен, даже если в предыдущем предложении catch
был оператор return
.