Exception.StackTrace Vlastnost

Definice

Získá řetězcovou reprezentaci okamžitých rámců v zásobníku volání.

public virtual string StackTrace { get; }
public virtual string? StackTrace { get; }

Hodnota vlastnosti

Řetězec, který popisuje bezprostřední rámce zásobníku volání. Pokud není k dispozici žádné trasování zásobníku (například před uvolněním zásobníku throw z příkazu), hodnota je null.

Implementuje

Příklady

Následující příklad kódu vyvolá a pak ho zachytí Exception a zobrazí trasování zásobníku StackTrace pomocí vlastnosti .

// Example for the Exception.HelpLink, Exception.Source,
// Exception.StackTrace, and Exception.TargetSite properties.
using System;

namespace NDP_UE_CS
{
    // Derive an exception; the constructor sets the HelpLink and
    // Source properties.
    class LogTableOverflowException : Exception
    {
        const string overflowMessage = "The log table has overflowed.";

        public LogTableOverflowException(
            string auxMessage, Exception inner ) :
                base( String.Format( "{0} - {1}",
                    overflowMessage, auxMessage ), inner )
        {
            this.HelpLink = "https://learn.microsoft.com";
            this.Source = "Exception_Class_Samples";
        }
    }

    class LogTable
    {
        public LogTable( int numElements )
        {
            logArea = new string[ numElements ];
            elemInUse = 0;
        }

        protected string[ ] logArea;
        protected int       elemInUse;

        // The AddRecord method throws a derived exception if
        // the array bounds exception is caught.
        public    int       AddRecord( string newRecord )
        {
            try
            {
                logArea[ elemInUse ] = newRecord;
                return elemInUse++;
            }
            catch( Exception e )
            {
                throw new LogTableOverflowException(
                    String.Format( "Record \"{0}\" was not logged.",
                        newRecord ), e );
            }
        }
    }

    class OverflowDemo
    {
        // Create a log table and force an overflow.
        public static void Main()
        {
            LogTable log = new LogTable( 4 );

            Console.WriteLine(
                "This example of \n   Exception.Message, \n" +
                "   Exception.HelpLink, \n   Exception.Source, \n" +
                "   Exception.StackTrace, and \n   Exception." +
                "TargetSite \ngenerates the following output." );

            try
            {
                for( int count = 1; ; count++ )
                {
                    log.AddRecord(
                        String.Format(
                            "Log record number {0}", count ) );
                }
            }
            catch( Exception ex )
            {
                Console.WriteLine( "\nMessage ---\n{0}", ex.Message );
                Console.WriteLine(
                    "\nHelpLink ---\n{0}", ex.HelpLink );
                Console.WriteLine( "\nSource ---\n{0}", ex.Source );
                Console.WriteLine(
                    "\nStackTrace ---\n{0}", ex.StackTrace );
                Console.WriteLine(
                    "\nTargetSite ---\n{0}", ex.TargetSite );
            }
        }
    }
}

/*
This example of
   Exception.Message,
   Exception.HelpLink,
   Exception.Source,
   Exception.StackTrace, and
   Exception.TargetSite
generates the following output.

Message ---
The log table has overflowed. - Record "Log record number 5" was not logged.

HelpLink ---
https://learn.microsoft.com

Source ---
Exception_Class_Samples

StackTrace ---
   at NDP_UE_CS.LogTable.AddRecord(String newRecord)
   at NDP_UE_CS.OverflowDemo.Main()

TargetSite ---
Int32 AddRecord(System.String)
*/

Poznámky

Zásobník provádění sleduje všechny metody, které se v daném okamžiku spouští. Trasování volání metody se nazývá trasování zásobníku. Výpis trasování zásobníku poskytuje způsob, jak sledovat zásobník volání na číslo řádku v metodě, kde dochází k výjimce.

Vlastnost StackTrace vrátí rámce zásobníku volání, které pocházejí z umístění, kde došlo k výjimce. Informace o dalších rámcích v zásobníku volání můžete získat vytvořením nové instance System.Diagnostics.StackTrace třídy a použitím její StackTrace.ToString metody.

Modul CLR (Common Language Runtime) aktualizuje trasování zásobníku při každém vyvolání výjimky v kódu aplikace (pomocí klíčového throw slova ). Pokud byla výjimka obnovena v metodě, která se liší od metody, kde byla původně vyvolán, trasování zásobníku obsahuje jak umístění v metodě, kde byla výjimka původně vyvolán, tak umístění v metodě, kde byla výjimka obnovena. Pokud je výjimka vyvolán a později znovu vyvolá, ve stejné metodě obsahuje trasování zásobníku pouze umístění, kde byla výjimka znovu vyvolán, a nezahrnuje umístění, kde byla výjimka původně vyvolán.

Vlastnost StackTrace nemusí hlásit tolik volání metod, kolik očekáváte, protože transformace kódu, jako je vkládání, ke kterým dochází během optimalizace.

Poznámky pro dědice

Vlastnost StackTrace je přepsána ve třídách, které vyžadují kontrolu nad obsahem nebo formátem trasování zásobníku.

Ve výchozím nastavení je trasování zásobníku zachyceno bezprostředně před vyvoláním objektu výjimky. Slouží StackTrace k získání informací o trasování zásobníku v případě, že není vyvolána žádná výjimka.

Platí pro

Produkt Verze
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Viz také