Exception.GetBaseException 方法

定義

在衍生類別中覆寫時,傳回一或多個後續的例外狀況的根本原因 Exception

C#
public virtual Exception GetBaseException ();

傳回

Exception

例外狀況鏈中擲回的第一個例外狀況。 如果目前的例外狀況的 InnerException 屬性為 null 參考 (在 Visual Basic 中為 Nothing),則這個屬性會傳回目前的例外狀況。

實作

範例

下列程式碼範例會定義兩個衍生 Exception 類別。 它會強制例外狀況,然後使用每個衍生類別再次擲回例外狀況。 程式碼示範如何使用 GetBaseException 方法來擷取原始例外狀況。

C#
// Example for the Exception.GetBaseException method.
using System;

namespace NDP_UE_CS
{
    // Define two derived exceptions to demonstrate nested exceptions.
    class SecondLevelException : Exception
    {
        public SecondLevelException( string message, Exception inner )
            : base( message, inner )
        { }
    }
    class ThirdLevelException : Exception
    {
        public ThirdLevelException( string message, Exception inner )
            : base( message, inner )
        { }
    }

    class NestedExceptions
    {
        public static void Main()
        {
            Console.WriteLine(
                "This example of Exception.GetBaseException " +
                "generates the following output." );
            Console.WriteLine(
                "\nThe program forces a division by 0, then " +
                "throws the exception \ntwice more, " +
                "using a different derived exception each time.\n" );

            try
            {
                // This function calls another that forces a
                // division by 0.
                Rethrow( );
            }
            catch( Exception ex )
            {
                Exception current;

                Console.WriteLine(
                    "Unwind the nested exceptions " +
                    "using the InnerException property:\n" );

                // This code unwinds the nested exceptions using the
                // InnerException property.
                current = ex;
                while( current != null )
                {
                    Console.WriteLine( current.ToString( ) );
                    Console.WriteLine( );
                    current = current.InnerException;
                }

                // Display the innermost exception.
                Console.WriteLine(
                    "Display the base exception " +
                    "using the GetBaseException method:\n" );
                Console.WriteLine(
                    ex.GetBaseException( ).ToString( ) );
            }
        }

        // This function catches the exception from the called
        // function DivideBy0( ) and throws another in response.
        static void Rethrow()
        {
            try
            {
                DivideBy0( );
            }
            catch( Exception ex )
            {
                throw new ThirdLevelException(
                    "Caught the second exception and " +
                    "threw a third in response.", ex );
            }
        }

        // This function forces a division by 0 and throws a second
        // exception.
        static void DivideBy0( )
        {
            try
            {
                int  zero = 0;
                int  ecks = 1 / zero;
            }
            catch( Exception ex )
            {
                throw new SecondLevelException(
                    "Forced a division by 0 and threw " +
                    "a second exception.", ex );
            }
        }
    }
}

/*
This example of Exception.GetBaseException generates the following output.

The program forces a division by 0, then throws the exception
twice more, using a different derived exception each time.

Unwind the nested exceptions using the InnerException property:

NDP_UE_CS.ThirdLevelException: Caught the second exception and threw a third in
 response. ---> NDP_UE_CS.SecondLevelException: Forced a division by 0 and thre
w a second exception. ---> System.DivideByZeroException: Attempted to divide by
 zero.
   at NDP_UE_CS.NestedExceptions.DivideBy0()
   --- End of inner exception stack trace ---
   at NDP_UE_CS.NestedExceptions.DivideBy0()
   at NDP_UE_CS.NestedExceptions.Rethrow()
   --- End of inner exception stack trace ---
   at NDP_UE_CS.NestedExceptions.Rethrow()
   at NDP_UE_CS.NestedExceptions.Main()

NDP_UE_CS.SecondLevelException: Forced a division by 0 and threw a second excep
tion. ---> System.DivideByZeroException: Attempted to divide by zero.
   at NDP_UE_CS.NestedExceptions.DivideBy0()
   --- End of inner exception stack trace ---
   at NDP_UE_CS.NestedExceptions.DivideBy0()
   at NDP_UE_CS.NestedExceptions.Rethrow()

System.DivideByZeroException: Attempted to divide by zero.
   at NDP_UE_CS.NestedExceptions.DivideBy0()

Display the base exception using the GetBaseException method:

System.DivideByZeroException: Attempted to divide by zero.
   at NDP_UE_CS.NestedExceptions.DivideBy0()
*/

備註

例外狀況鏈結是由一組例外狀況所組成,使得鏈結中的每個例外狀況都會擲回,做為其 屬性中所 InnerException 參考例外狀況的直接結果。 針對指定的鏈結,可能只有一個例外狀況是鏈結中所有其他例外狀況的根本原因。 這個例外狀況稱為基底例外狀況,而且其 InnerException 屬性一律包含 Null 參考。

對於例外狀況鏈結中的所有例外狀況, GetBaseException 方法必須在基底例外狀況) (傳回相同的物件。

GetBaseException當您想要尋找例外狀況的根本原因,但不需要目前例外狀況與第一個例外狀況之間可能發生之例外狀況的相關資訊時,請使用 方法。

給繼承者的注意事項

方法 GetBaseException 會在需要控制例外狀況內容或格式的類別中覆寫。

適用於

產品 版本
.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
.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
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0