Compartilhar via


StackOverflowException Classe

Definição

A exceção gerada quando a pilha de execução excede o tamanho da pilha. Essa classe não pode ser herdada.

public ref class StackOverflowException sealed : SystemException
public sealed class StackOverflowException : SystemException
[System.Serializable]
public sealed class StackOverflowException : SystemException
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class StackOverflowException : SystemException
type StackOverflowException = class
    inherit SystemException
[<System.Serializable>]
type StackOverflowException = class
    inherit SystemException
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type StackOverflowException = class
    inherit SystemException
Public NotInheritable Class StackOverflowException
Inherits SystemException
Herança
StackOverflowException
Atributos

Exemplos

O exemplo a seguir usa um contador para garantir que o número de chamadas recursivas para o Execute método não exceda um máximo definido pela constante MAX_RECURSIVE_CALLS.

using System;

public class Example
{
   private const int MAX_RECURSIVE_CALLS = 1000;
   static int ctr = 0;
   
   public static void Main()
   {
      Example ex = new Example();
      ex.Execute();
      Console.WriteLine("\nThe call counter: {0}", ctr);
   }

   private void Execute()
   {
      ctr++;
      if (ctr % 50 == 0)
         Console.WriteLine("Call number {0} to the Execute method", ctr);
         
      if (ctr <= MAX_RECURSIVE_CALLS)
         Execute();
         
      ctr--;
   }
}
// The example displays the following output:
//       Call number 50 to the Execute method
//       Call number 100 to the Execute method
//       Call number 150 to the Execute method
//       Call number 200 to the Execute method
//       Call number 250 to the Execute method
//       Call number 300 to the Execute method
//       Call number 350 to the Execute method
//       Call number 400 to the Execute method
//       Call number 450 to the Execute method
//       Call number 500 to the Execute method
//       Call number 550 to the Execute method
//       Call number 600 to the Execute method
//       Call number 650 to the Execute method
//       Call number 700 to the Execute method
//       Call number 750 to the Execute method
//       Call number 800 to the Execute method
//       Call number 850 to the Execute method
//       Call number 900 to the Execute method
//       Call number 950 to the Execute method
//       Call number 1000 to the Execute method
//
//       The call counter: 0
let MAX_RECURSIVE_CALLS = 1000
let mutable ctr = 0
   
let rec execute () =
    ctr <- ctr + 1
    if ctr % 50 = 0 then
        printfn $"Call number {ctr} to the Execute method"
        
    if ctr <= MAX_RECURSIVE_CALLS then
        execute ()
        
    ctr <- ctr - 1
    
execute ()
printfn $"\nThe call counter: {ctr}"
// The example displays the following output:
//       Call number 50 to the Execute method
//       Call number 100 to the Execute method
//       Call number 150 to the Execute method
//       Call number 200 to the Execute method
//       Call number 250 to the Execute method
//       Call number 300 to the Execute method
//       Call number 350 to the Execute method
//       Call number 400 to the Execute method
//       Call number 450 to the Execute method
//       Call number 500 to the Execute method
//       Call number 550 to the Execute method
//       Call number 600 to the Execute method
//       Call number 650 to the Execute method
//       Call number 700 to the Execute method
//       Call number 750 to the Execute method
//       Call number 800 to the Execute method
//       Call number 850 to the Execute method
//       Call number 900 to the Execute method
//       Call number 950 to the Execute method
//       Call number 1000 to the Execute method
//
//       The call counter: 0
Module Example
   Private Const MAX_RECURSIVE_CALLS As Integer = 1000
   Dim ctr As Integer = 0

   Public Sub Main()
      Execute()
      Console.WriteLine()
      Console.WriteLine("The call counter: {0}", ctr)
   End Sub

   Private Sub Execute()
      ctr += 1
      If ctr Mod 50 = 0 Then
         Console.WriteLine("Call number {0} to the Execute method", ctr)
      End If
      
      If ctr <= MAX_RECURSIVE_CALLS Then
         Execute()
      End If

      ctr -= 1
   End Sub
End Module
' The example displays the following output:
'       Call number 50 to the Execute method
'       Call number 100 to the Execute method
'       Call number 150 to the Execute method
'       Call number 200 to the Execute method
'       Call number 250 to the Execute method
'       Call number 300 to the Execute method
'       Call number 350 to the Execute method
'       Call number 400 to the Execute method
'       Call number 450 to the Execute method
'       Call number 500 to the Execute method
'       Call number 550 to the Execute method
'       Call number 600 to the Execute method
'       Call number 650 to the Execute method
'       Call number 700 to the Execute method
'       Call number 750 to the Execute method
'       Call number 800 to the Execute method
'       Call number 850 to the Execute method
'       Call number 900 to the Execute method
'       Call number 950 to the Execute method
'       Call number 1000 to the Execute method
'
'       The call counter: 0

Comentários

StackOverflowException é gerado para erros de estouro de pilha de execução, normalmente no caso de uma recursão muito profunda ou não vinculada. Portanto, verifique se o código não tem um loop infinito ou uma recursão infinita.

StackOverflowException usa o COR_E_STACKOVERFLOW HRESULT, que tem o valor 0x800703E9. A Localloc instrução il (linguagem intermediária) lança StackOverflowException. Para obter uma lista de valores de propriedade iniciais para um StackOverflowException objeto , consulte os StackOverflowException construtores.

A partir do .NET Framework 2.0, você não pode capturar um StackOverflowException objeto com um try/catch bloco e o processo correspondente é encerrado por padrão. Consequentemente, você deve escrever seu código para detectar e evitar um estouro de pilha. Por exemplo, se o aplicativo depender da recursão, use um contador ou uma condição de estado para encerrar o loop recursivo. Consulte a seção Exemplos para obter uma ilustração dessa técnica.

Observação

A aplicação do HandleProcessCorruptedStateExceptionsAttribute atributo a um método que lança um StackOverflowException não tem efeito. Você ainda não pode lidar com a exceção do código do usuário.

Se seu aplicativo hospeda o CLR (Common Language Runtime), ele pode especificar que o CLR deve descarregar o domínio do aplicativo onde ocorre a exceção de estouro de pilha e permitir que o processo correspondente continue. Para obter mais informações, consulte Interface ICLRPolicyManager.

Construtores

StackOverflowException()

Inicializa uma nova instância da StackOverflowException classe , definindo a Message propriedade da nova instância como uma mensagem fornecida pelo sistema que descreve o erro, como "A operação solicitada causou um estouro de pilha". Essa mensagem leva em conta a cultura atual do sistema.

StackOverflowException(String)

Inicializa uma nova instância da classe StackOverflowException com uma mensagem de erro especificada.

StackOverflowException(String, Exception)

Inicializa uma nova instância da classe StackOverflowException com uma mensagem de erro especificada e uma referência à exceção interna que é a causa da exceção.

Propriedades

Data

Obtém uma coleção de pares de chave/valor que fornecem informações definidas pelo usuário adicionais sobre a exceção.

(Herdado de Exception)
HelpLink

Obtém ou define um link para o arquivo de ajuda associado a essa exceção.

(Herdado de Exception)
HResult

Obtém ou define HRESULT, um valor numérico codificado que é atribuído a uma exceção específica.

(Herdado de Exception)
InnerException

Obtém a instância Exception que causou a exceção atual.

(Herdado de Exception)
Message

Obtém uma mensagem que descreve a exceção atual.

(Herdado de Exception)
Source

Obtém ou define o nome do aplicativo ou objeto que causa o erro.

(Herdado de Exception)
StackTrace

Obtém uma representação de cadeia de caracteres de quadros imediatos na pilha de chamadas.

(Herdado de Exception)
TargetSite

Obtém o método que gerou a exceção atual.

(Herdado de Exception)

Métodos

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetBaseException()

Quando substituído em uma classe derivada, retorna a Exception que é a causa raiz de uma ou mais exceções subsequentes.

(Herdado de Exception)
GetHashCode()

Serve como a função de hash padrão.

(Herdado de Object)
GetObjectData(SerializationInfo, StreamingContext)
Obsoleto.

Quando substituído em uma classe derivada, define o SerializationInfo com informações sobre a exceção.

(Herdado de Exception)
GetType()

Obtém o tipo de runtime da instância atual.

(Herdado de Exception)
MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
ToString()

Cria e retorna uma representação de cadeia de caracteres da exceção atual.

(Herdado de Exception)

Eventos

SerializeObjectState
Obsoleto.

Ocorre quando uma exceção é serializada para criar um objeto de estado de exceção que contém dados serializados sobre a exceção.

(Herdado de Exception)

Aplica-se a

Confira também