Delphi - попробуй, наконец, блок гарантированно выполняется компилятором? - PullRequest
6 голосов
/ 25 августа 2011

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

Есть ли такой случай, когда попытка / окончание окончание не будет выполнена?

 try
  //some error here
 finally
  //code that MUST be executed
 end;

Я не говорю о том, как должны использоваться блоки try..except / finally, я просто спрашиваю, может ли это произойти.

LE: Application.Terminate / unplugваш компьютер являются частными случаями.

Ответы [ 4 ]

22 голосов
/ 25 августа 2011

try..finally гарантирует, что код в блоке finally будет выполняться независимо от любого исключения, возникающего в защищенном блоке. Это, конечно, не применимо, если процесс завершается до того, как может выполняться блок finally, например, TerminateProcess или выключением питания. Бесконечный цикл в защищенном блоке также может помешать выполнению блока finally.

4 голосов
/ 25 августа 2011

Если питание потеряно (например, если вы отключите компьютер от сети, если у него нет батареи и он не подключен к ИБП), вполне возможно, что блок finally не будет работать.Серьезная неисправность ОС или драйвера (например, BSOD) также может быть причиной этого.Однако вся идея конструкции try..finally заключается в том, что блок finally должен выполняться, даже если внутри блока try возникает исключение (любого типа).Блок finally будет запущен, даже если внутри блока try есть оператор exit.

3 голосов
/ 25 августа 2011

Если ваше приложение вызывает исключение DEP (Data Execution Prevention), я не думаю, что Windows позволит вам продолжить. Ваш процесс потерпит неудачу, не выполняя раздел finally. Ваш процесс просто "уходит". Однако это не имеет ничего общего с тем, что компилятор делал или не делал.

1 голос
/ 25 августа 2011

После того, как будет введен try / finally, блок finally будет выполнен до того, как выполнение оставит попытку / finally.

...