Все, что находится внутри блоков finally, выполняется (почти) всегда, так в чем же разница между заключением в него кода или его закрытием?
c#
exception-handling
Родриго
источник
источник
Ответы:
Код внутри блока finally будет выполнен независимо от того, существует ли исключение. Это очень удобно, когда речь идет о некоторых служебных функциях, которые вы всегда должны запускать как закрытие соединений.
Теперь, я думаю, ваш вопрос, почему вы должны сделать это:
Когда вы можете сделать это:
Ответ заключается в том, что код внутри вашего оператора catch часто перебрасывает исключение или прерывает текущую функцию. С последним кодом, "AlwaysDoThis ();" Вызов не будет выполнен, если код внутри оператора catch выдаст возврат или сгенерирует новое исключение.
источник
Большинство преимуществ использования try-finally уже было указано, но я подумал, что добавлю это:
Такое поведение делает его очень полезным в различных ситуациях, особенно когда вам необходимо выполнить очистку (утилизировать ресурсы), хотя в этом случае часто лучше использовать блок using .
источник
каждый раз, когда вы используете неуправляемые запросы кода, такие как потоковые считыватели, запросы БД и т. д .; и вы хотите перехватить исключение, затем использовать try catch finally и закрыть поток, считыватель данных и т. д. в finally, если при возникновении ошибок соединение не закрывается, это действительно плохо с запросами базы данных
если вы не хотите отлавливать ошибку, используйте
и объект подключения будет удален автоматически при возникновении ошибки, но вы не фиксируете ошибку
источник
Потому что, наконец, будет выполняться, даже если вы не обрабатываете исключение в блоке catch.
источник
Наконец, операторы могут выполняться даже после возврата.
источник
finally
, как в:это гарантированная возможность выполнить код после вашего
try..catch
блока, независимо от того, выдал ли ваш блок try исключение.Это делает его идеальным для таких вещей, как освобождение ресурсов, соединений БД, файловых дескрипторов и т. Д.
источник
Я объясню использование наконец с исключением чтения файлов Пример
В приведенном выше примере, если файл с именем Data.txt отсутствует, будет сгенерировано исключение, которое будет обработано, но вызываемый оператор
StreamReader.Close();
никогда не будет выполнен.Из-за этого ресурсы, связанные с читателем, так и не были выпущены.
Удачного кодирования :)
Примечание: «@» используется для создания дословной строки, чтобы избежать ошибки «Нераспознанная escape-последовательность». Символ @ означает буквальное прочтение этой строки, иначе не интерпретируйте управляющие символы.
источник
Скажем, вам нужно установить курсор обратно на указатель по умолчанию вместо ожидающего (песочные часы) курсора. Если перед установкой курсора возникает исключение, которое не приводит к аварийному завершению работы приложения, вы можете остаться с запутанным курсором.
источник
Иногда вы не хотите обрабатывать исключение (без блока catch), но хотите, чтобы выполнялся некоторый код очистки.
Например:
источник
Блок finally полезен для очистки любых ресурсов, выделенных в блоке try, а также для запуска любого кода, который должен выполняться, даже если есть исключение. Управление всегда передается блоку finally независимо от выхода из блока try.
источник
Ааа ... Я думаю, я понимаю, что вы говорите! Заняло у меня секунду ... вы задаетесь вопросом "зачем размещать его в блоке finally, а не после блока finally и полностью вне try-catch-finally".
Например, это может быть потому, что вы останавливаете выполнение, если вы выдаваете ошибку, но вы все еще хотите очистить ресурсы, такие как открытые файлы, соединения с базой данных и т. Д.
источник
Поток управления в блоке «В конце» идет после блока «Пробовать» или «Поймать».
с исключением 1> 2> 3> 4> 5, если 3 имеет оператор Return 1> 2> 3> 4
без исключения 1> 2> 4> 5, если 2 имеет оператор возврата 1> 2> 4
источник
Как указано в документации :
Также стоит прочитать это , в котором говорится:
Таким образом, ясно, что код, который находится в
finally
предложении, будет выполнен, даже если в предыдущемcatch
предложении былreturn
оператор.источник