Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

Exception.InnerException Property

Definition

Namespace:
System
Assemblies:
mscorlib.dll, System.Runtime.dll
Assemblies:
netstandard.dll, System.Runtime.dll
Assembly:
System.Runtime.dll
Assembly:
mscorlib.dll
Assembly:
netstandard.dll
Source:
Exception.cs
Source:
Exception.cs
Source:
Exception.cs
Source:
Exception.cs
Source:
Exception.cs

Important

Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.

Gets the Exception instance that caused the current exception.

public:
 property Exception ^ InnerException { Exception ^ get(); };
public Exception InnerException { get; }
public Exception? InnerException { get; }
member this.InnerException : Exception
Public ReadOnly Property InnerException As Exception

Property Value

An object that describes the error that caused the current exception. The InnerException property returns the same value as was passed into the Exception(String, Exception) constructor, or null if the inner exception value was not supplied to the constructor. This property is read-only.

Implements

Examples

The following example demonstrates throwing and catching an exception that references an inner exception.

using System;

public class AppException : Exception
{
 public AppException(String message) : base (message)
 {}

 public AppException(String message, Exception inner) : base(message,inner) {}
}

public class Example
{
 public static void Main()
 {
 Example ex = new Example();

 try {
 ex.CatchInner();
 }
 catch(AppException e) {
 Console.WriteLine ("In catch block of Main method.");
 Console.WriteLine("Caught: {0}", e.Message);
 if (e.InnerException != null)
 Console.WriteLine("Inner exception: {0}", e.InnerException);
 }
 }

 public void ThrowInner ()
 {
 throw new AppException("Exception in ThrowInner method.");
 }

 public void CatchInner()
 {
 try {
 this.ThrowInner();
 }
 catch (AppException e) {
 throw new AppException("Error in CatchInner caused by calling the ThrowInner method.", e);
 }
 }
}
// The example displays the following output:
// In catch block of Main method.
// Caught: Error in CatchInner caused by calling the ThrowInner method.
// Inner exception: AppException: Exception in ThrowInner method.
// at Example.ThrowInner()
// at Example.CatchInner()
open System

type AppException =
 inherit Exception
 
 new (message: string) = { inherit Exception(message) }

 new (message: string, inner) = { inherit Exception(message, inner) }

let throwInner () =
 raise (AppException "Exception in throwInner function.")
 ()

let catchInner () =
 try
 throwInner ()
 with :? AppException as e ->
 raise (AppException("Error in catchInner caused by calling the throwInner function.", e) )

[<EntryPoint>]
let main _ =
 try
 catchInner ()
 with :? AppException as e ->
 printfn "In with block of main function."
 printfn $"Caught: {e.Message}"
 if e.InnerException <> null then
 printfn $"Inner exception: {e.InnerException}"
 0
// The example displays the following output:
// In with block of main function.
// Caught: Error in catchInner caused by calling the throwInner function.
// Inner exception: Example+AppException: Exception in throwInner function.
// at Example.throwInner()
// at Example.catchInner()
Public Class AppException : Inherits Exception
 Public Sub New(message As String)
 MyBase.New(message)
 End Sub
 
 Public Sub New(message As String, inner As Exception)
 MyBase.New(message, inner)
 End Sub
End Class

Public Class Example
 Public Shared Sub Main()
 Dim testInstance As New Example()
 Try
 testInstance.CatchInner()
 Catch e As AppException
 Console.WriteLine ("In catch block of Main method.")
 Console.WriteLine("Caught: {0}", e.Message)
 If e.InnerException IsNot Nothing Then
 Console.WriteLine("Inner exception: {0}", e.InnerException)
 End If
 End Try
 End Sub
 
 Public Sub ThrowInner()
 Throw New AppException("Exception in ThrowInner method.")
 End Sub
 
 Public Sub CatchInner()
 Try
 Me.ThrowInner()
 Catch e As AppException
 Throw New AppException("Error in CatchInner caused by calling the ThrowInner method.", e)
 End Try
 End Sub
End Class
' The example displays the following output:
' In catch block of Main method.
' Caught: Error in CatchInner caused by calling the ThrowInner method.
' Inner exception: AppException: Exception in ThrowInner method.
' at Example.ThrowInner()
' at Example.CatchInner()

Remarks

When an exception X is thrown as a direct result of a previous exception Y, the InnerException property of X should contain a reference to Y.

Use the InnerException property to obtain the set of exceptions that led to the current exception.

You can create a new exception that catches an earlier exception. The code that handles the second exception can make use of the additional information from the earlier exception to handle the error more appropriately.

Suppose that there is a function that reads a file and formats the data from that file. In this example, as the code tries to read the file, an IOException is thrown. The function catches the IOException and throws a FileNotFoundException. The IOException could be saved in the InnerException property of the FileNotFoundException, enabling the code that catches the FileNotFoundException to examine the cause of the initial error.

The InnerException property, which holds a reference to the inner exception, is set upon initialization of the exception object.

Applies to


Feedback

Was this page helpful?