Eu tenho uma chamada recursiva para um método que lança uma exceção de estouro de pilha. A primeira chamada é cercada por um bloco try catch, mas a exceção não é detectada.
A exceção de estouro de pilha se comporta de maneira especial? Posso capturar / manipular a exceção adequadamente?
Não tenho certeza se relevante, mas informações adicionais:
a exceção não é lançada no tópico principal
o objeto onde o código está lançando a exceção é carregado manualmente por Assembly.LoadFrom (...). CreateInstance (...)
c#
try-catch
stack-overflow
Totó
fonte
fonte
Assert.Fail
vez disso. Então, sério - como vamos fazer isso?Respostas:
A partir do 2.0, uma exceção StackOverflow só pode ser detectada nas seguintes circunstâncias.
* "ambiente hospedado" como em "meu código hospeda CLR e eu configuro as opções de CLR" e não "meu código é executado em hospedagem compartilhada"
fonte
Starting with 2.0 ...
, Estou curioso, o que os está impedindo de pegar SO e como foi possível1.1
(você mencionou isso no seu comentário)?O jeito certo é consertar o estouro, mas ....
Você pode obter uma pilha maior: -
Você pode usar a propriedade System.Diagnostics.StackTrace FrameCount para contar os quadros usados e lançar sua própria exceção quando um limite de quadro for atingido.
Ou você pode calcular o tamanho da pilha restante e lançar sua própria exceção quando cair abaixo de um limite: -
Basta pegar o queijo. ;)
fonte
Cheese
está longe de ser específico. Eu iria parathrow new CheeseException("Gouda");
Na página do MSDN em StackOverflowException s:
fonte
Como vários usuários já disseram, você não pode pegar a exceção. No entanto, se você está lutando para descobrir onde está acontecendo, você pode configurar o visual studio para quebrar quando for lançado.
Para fazer isso, você precisa abrir as Configurações de exceção no menu 'Depurar'. Em versões mais antigas do Visual Studio, isso está em 'Debug' - 'Exceptions'; nas versões mais recentes, está em 'Debug' - 'Windows' - 'Configurações de exceção'.
Depois de abrir as configurações, expanda 'Common Language Runtime Exceptions', expanda 'System', role para baixo e marque 'System.StackOverflowException'. Em seguida, você pode examinar a pilha de chamadas e procurar o padrão de repetição das chamadas. Isso deve dar uma ideia de onde procurar para consertar o código que está causando o estouro da pilha.
fonte
Conforme mencionado acima várias vezes, não é possível capturar uma StackOverflowException que foi gerada pelo sistema devido a um estado de processo corrompido. Mas há uma maneira de perceber a exceção como um evento:
No entanto, seu aplicativo será encerrado após sair da função de evento (uma solução MUITO suja, era reiniciar o aplicativo dentro deste evento haha, não fiz isso e nunca farei). Mas é bom o suficiente para registrar!
fonte
Sim, no CLR 2.0, o estouro de pilha é considerado uma situação irrecuperável. Portanto, o tempo de execução ainda encerra o processo.
Para obter detalhes, consulte a documentação http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx
fonte
StackOverflowException
encerra o processo por padrão.Você não pode. O CLR não vai deixar você. Um estouro de pilha é um erro fatal e não pode ser recuperado.
fonte
Você não pode, como a maioria das postagens está explicando, deixe-me adicionar outra área:
Em muitos sites você encontrará pessoas dizendo que a maneira de evitar isso é usar um AppDomain diferente, portanto, se isso acontecer, o domínio será descarregado. Isso é absolutamente errado (a menos que você hospede seu CLR), pois o comportamento padrão do CLR irá gerar um evento KillProcess, derrubando seu AppDomain padrão.
fonte
É impossível, e por um bom motivo (por exemplo, pense em todos aqueles catch (Exception) {} ao redor).
Se você deseja continuar a execução após o estouro da pilha, execute o código perigoso em um AppDomain diferente. As políticas CLR podem ser definidas para encerrar o AppDomain atual em estouro sem afetar o domínio original.
fonte