英語で読む

次の方法で共有


Exception.StackTrace プロパティ

定義

呼び出し履歴で直前のフレームの文字列形式を取得します。

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

プロパティ値

呼び出し履歴の直前のフレームを説明する文字列。 使用可能なスタック トレースがない場合 (ステートメントから throw スタック アンワインドする前など)、値は です null

実装

次のコード例では、 を Exception スローし、それをキャッチし、 プロパティを使用してスタック トレースを StackTrace 表示します。

// 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)
*/

注釈

実行スタックは、指定された時点で実行されているすべてのメソッドを追跡します。 メソッド呼び出しのトレースは、スタック トレースと呼ばれます。 スタック トレースの一覧では、呼び出し履歴に従って、例外が発生したメソッドの行番号を取得できます。

プロパティは StackTrace 、例外がスローされた場所で発生した呼び出し履歴のフレームを返します。 クラスの新しいインスタンスを作成し、そのStackTrace.ToStringメソッドを使用して、呼び出し履歴内の追加のフレームに関する情報をSystem.Diagnostics.StackTrace取得できます。

共通言語ランタイム (CLR) は、(キーワード (keyword)を使用して) アプリケーション コードで例外がスローされるたびにスタック トレースをthrow更新します。 最初にスローされたメソッドとは異なるメソッドで例外が再スローされた場合、スタック トレースには、例外が最初にスローされたメソッド内の場所と、例外が再スローされたメソッド内の場所の両方が含まれます。 同じメソッドで例外がスローされ、後で再スローされた場合、スタック トレースには例外が再スローされた場所のみが含まれ、例外が最初にスローされた場所は含まれません。

StackTrace最適化中に発生するコード変換 (インライン化など) が原因で、 プロパティから期待される数のメソッド呼び出しが報告されない場合があります。

注意 (継承者)

プロパティは StackTrace 、スタック トレースの内容または形式を制御する必要があるクラスでオーバーライドされます。

既定では、スタック トレースは例外オブジェクトがスローされる直前にキャプチャされます。 例外がスローされていない場合にスタック トレース情報を取得するには、 を使用 StackTrace します。

適用対象

製品 バージョン
.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

こちらもご覧ください