Condições quando finalmente não executa em um .net try..finally bloquear
-
02-07-2019 - |
Pergunta
Basicamente Ouvi dizer que certas condições fará com que .net ao golpe passado, o bloco finally. Alguém sabe o que são essas condições?
Solução
Duas possibilidades:
O bloco finally não será executada quando há uma StackOverflowException
uma vez que não há espaço para a pilha até mesmo executar qualquer mais código. Ele também não será chamado quando há uma ExecutionEngineException
, que podem surgir a partir de uma chamada para Environment.FailFast()
.
Outras dicas
A menos que o CLR explode e desce com um ExecutingEngineException (eu vi alguns no .net 1,1 dias com apenas a quantidade certa de interoperabilidade :) .. Eu acho que finalmente deve sempre executar.
Você pode obter uma situação em que o código no bloco try provoca uma SecurityException para ser lançada antes do bloco try entrou (em vez da exceção é lançada quando o método contendo é chamado (ver http://msdn.microsoft.com/en-us/library/fk6t46tz (VS.71) .aspx )), nesta situação, você nunca sequer entrar no bloco try para que o código no bloco finally nunca é chamado.
Outras possibilidades incluem StackOverflowException e ExecutingEngineException.
bloco Finally
em background thread
não pode executar. No entanto, ele depende da execução concluída de main foreground thread
que termina a operação background thread
mesmo antes da execução completa de 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");
}
}
}
Há também método Application.Exit.
Nem o código que segue um bloco finally, nem o código em escopos externos, será executado sem o bloco finally tendo sido iniciado pela primeira vez (uma exceção dentro do bloco finally pode causar-lhe para sair prematuramente, em que a execução caso vai saltar para fora do finalizador para um escopo externo). Se o código antes do último bloco fica preso em um loop infinito ou um método que não sai, ou se o contexto de execução é destruído por completo, o bloco finally não executar.
Note que é adequado confiar em blocos finally, ao contrário dos métodos "Finalizar" (ou C # "destruidores") que não deve adequadamente ser invocado.