В основном я слышал, что определенные условия вызовут .net, чтобы пропустить последний блок. Кто-нибудь знает, что это за условия?Условия, когда, наконец, не выполняется в .net try..finally блок
ответ
Две возможности:
Окончательно блок не будет выполняться, когда есть StackOverflowException
так как нет места в стеке даже выполнять больше кода. Он также не будет вызываться, когда есть ExecutionEngineException
, который может возникнуть в результате вызова до Environment.FailFast()
.
тех пор, пока CLR не взрывается и идет вниз с ExecutingEngineException (я видел несколько в .net 1.1 дней с правильным количеством COM Interop :) .. Я думаю, что в конце концов должен всегда выполнить.
Вы можете получить такую ситуацию, когда код в блоке try приведет к вызову SecurityException до ввода блока try (вместо этого исключение вызывается при вызове метода-метода (см. http://msdn.microsoft.com/en-us/library/fk6t46tz(VS.71).aspx)), в этой ситуации вы никогда не даже введите блок try, чтобы код в блоке finally никогда не вызывался.
Другие возможности включают StackOverflowException и ExecutingEngineException.
Существует также Application.Exit метод.
Ни один код, который следует за блоком finally или кодом во внешних областях, не будет выполняться без первого блока finally, который был запущен первым (исключение в блоке finally может привести к его преждевременному выходу, и в этом случае выполнение выскочит из финализатор к внешнему виду). Если код до блока finally застревает в бесконечном цикле или методе, который никогда не выходит, или если контекст выполнения полностью уничтожен, блок finally не будет выполняться.
Обратите внимание, что в конце концов блокировать, в отличие от методов «Finalize» (или C# «деструкторов», полагаться на блоки finally), на которые не следует должным образом полагаться.
Finally
блок на background thread
не может быть выполнен. Однако это зависит от выполненного выполнения main foreground thread
, который завершает работу background thread
еще до полного выполнения background thread
.
class Program
{
static void Main(string[] args)
{
Program prgm = new Program();
Thread backgroundThread = new Thread(prgm.CheckBgThread);
backgroundThread.IsBackground = true;
backgroundThread.Start();
Console.WriteLine("Closing the program....");
}
void CheckBgThread()
{
try
{
Console.WriteLine("Doing some work...");
Thread.Sleep(500);
}
finally
{
Console.WriteLine("This should be always executed");
}
}
}
- 1. Почему, наконец, блок не выполняется?
- 2. Как и когда выполняется блок finally?
- 3. , когда блок finally не выполняется, когда блок try или catch прерван
- 4. Есть ли такой случай, когда в try \ finally блок, наконец, не будет выполнен?
- 5. блок try-catch-finally в java
- 6. Try/Catch/Наконец, используйте исключение из Catch in finally?
- 7. Объясните, что «наконец» используется в блоках try-catch-finally
- 8. Когда выполняется блок finally, если блок catch содержит оператор continue?
- 9. В .NET, наконец, эквивалентно try-catch-throw?
- 10. Используйте блок «try-finally» без блока «catch»
- 11. наконец, блок в C#
- 12. порядок выполнения try catch и, наконец, блок
- 13. Когда использовать и когда не использовать Try Catch Наконец
- 14. Попробуйте, наконец, блок
- 15. System.exit() приводит unexecutable наконец, блок
- 16. Недоступный код-try-catch-finally
- 17. Исключение из блока «Наконец-то на Try-finally»
- 18. C# Try/Catch/Finally
- 19. Try-finally vs Thread.BeginCriticalRegion
- 20. Каковы возможные причины, по которым наконец асинхронный {try ... finally ...} не вызван? Rx Приглашен
- 21. Является ли блок try-catch-finally синхронным в node.js?
- 22. Почему код в блоке finally не выполняется?
- 23. покрытия кода, наконец, блок
- 24. В каких ситуациях блок finally не выполняется в C#?
- 25. Почему это «наконец» выполняется?
- 26. Вам действительно нужен блок «finally»
- 27. Как избежать сценария, в котором, наконец, блок не выполняется
- 28. Не могу получить блок try-catch-finally для работы
- 29. наконец-блок и нити подвески
- 30. Обработка исключений Java, наконец, блок
Возможно, стоит отметить, что ExecutingEngineException может возникнуть из вызова Environment.FailFast() – 2010-01-11 11:55:46
насчет OutOfMemoryException и ThreadAbortException? – 2012-02-09 13:49:13