StackOverflowException Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Výjimka, která se vyvolá, když zásobník spuštění překročí velikost zásobníku. Tato třída se nemůže dědit.
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
- Dědičnost
- Atributy
Příklady
Následující příklad používá čítač k zajištění, že počet rekurzivních volání Execute
metody nepřekročí maximum definované MAX_RECURSIVE_CALLS konstantou.
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
Poznámky
StackOverflowException
je vyvolána pro chyby přetečení zásobníku spuštění, obvykle v případě velmi hluboké nebo nevázané rekurze. Proto se ujistěte, že váš kód neobsahuje nekonečnou smyčku nebo nekonečnou rekurze.
StackOverflowException
používá COR_E_STACKOVERFLOW HRESULT, který má hodnotu 0x800703E9. Instrukce Localloc jazyka IL (Intermediate Language) vyvolá StackOverflowException
. Seznam počátečních hodnot vlastností objektu StackOverflowException
naleznete v konstruktorech StackOverflowException .
Počínaje rozhraním .NET Framework 2.0 nelze zachytit StackOverflowException
objekt s blokem try
/catch
a odpovídající proces je ve výchozím nastavení ukončen. V důsledku toho byste měli napsat kód, který detekuje přetečení zásobníku a zabrání mu. Pokud například vaše aplikace závisí na rekurzi, použijte k ukončení rekurzivní smyčky čítač nebo stavovou podmínku.
Ilustrace této techniky najdete v části Příklady .
Poznámka
Použití atributu HandleProcessCorruptedStateExceptionsAttribute na metodu, která vyvolá výjimku , StackOverflowException
nemá žádný vliv. Stále nemůžete zpracovat výjimku z uživatelského kódu.
Pokud vaše aplikace hostuje modul CLR (Common Language Runtime), může určit, že modul CLR má uvolnit doménu aplikace, ve které dochází k výjimce přetečení zásobníku, a nechat příslušný proces pokračovat. Další informace najdete v tématu Rozhraní ICLRPolicyManager.
Konstruktory
StackOverflowException() |
Inicializuje novou instanci StackOverflowException třídy a nastaví Message vlastnost nové instance na zprávu dodanou systémem, která popisuje chybu, například "Požadovaná operace způsobila přetečení zásobníku". Tato zpráva bere v úvahu aktuální jazykovou verzi systému. |
StackOverflowException(String) |
Inicializuje novou instanci StackOverflowException třídy se zadanou chybovou zprávou. |
StackOverflowException(String, Exception) |
Inicializuje novou instanci StackOverflowException třídy se zadanou chybovou zprávou a odkazem na vnitřní výjimku, která je příčinou této výjimky. |
Vlastnosti
Data |
Získá kolekci párů klíč/hodnota, které poskytují další uživatelem definované informace o výjimce. (Zděděno od Exception) |
HelpLink |
Získá nebo nastaví odkaz na soubor nápovědy přidružený k této výjimce. (Zděděno od Exception) |
HResult |
Získá nebo nastaví HRESULT, kódovaná číselná hodnota, která je přiřazena ke konkrétní výjimce. (Zděděno od Exception) |
InnerException |
Exception Získá instanci, která způsobila aktuální výjimku. (Zděděno od Exception) |
Message |
Získá zprávu, která popisuje aktuální výjimku. (Zděděno od Exception) |
Source |
Získá nebo nastaví název aplikace nebo objektu, který způsobuje chybu. (Zděděno od Exception) |
StackTrace |
Získá řetězcovou reprezentaci okamžitých rámců v zásobníku volání. (Zděděno od Exception) |
TargetSite |
Získá metodu, která vyvolá aktuální výjimku. (Zděděno od Exception) |
Metody
Equals(Object) |
Určí, zda se zadaný objekt rovná aktuálnímu objektu. (Zděděno od Object) |
GetBaseException() |
Při přepsání v odvozené třídě vrátí hodnotu Exception , která je původní příčinou jedné nebo více následných výjimek. (Zděděno od Exception) |
GetHashCode() |
Slouží jako výchozí hashovací funkce. (Zděděno od Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Zastaralé.
Při přepsání v odvozené třídě nastaví s SerializationInfo informacemi o výjimce. (Zděděno od Exception) |
GetType() |
Získá typ modulu runtime aktuální instance. (Zděděno od Exception) |
MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Objectsouboru . (Zděděno od Object) |
ToString() |
Vytvoří a vrátí řetězcovou reprezentaci aktuální výjimky. (Zděděno od Exception) |
Událost
SerializeObjectState |
Zastaralé.
Nastane, když je výjimka serializována k vytvoření objektu stavu výjimky, který obsahuje serializovaná data o výjimce. (Zděděno od Exception) |