Bei Fragen wie diesen öffne ich normalerweise ein leeres Konsolenanwendungsprojekt in Visual Studio und schreibe ein kleines Beispielprogramm:
using System;
class Program
{
static void Main(string[] args)
{
try
{
try
{
throw new Exception("exception thrown from try block");
}
catch (Exception ex)
{
Console.WriteLine("Inner catch block handling {0}.", ex.Message);
throw;
}
finally
{
Console.WriteLine("Inner finally block");
throw new Exception("exception thrown from finally block");
Console.WriteLine("This line is never reached");
}
}
catch (Exception ex)
{
Console.WriteLine("Outer catch block handling {0}.", ex.Message);
}
finally
{
Console.WriteLine("Outer finally block");
}
}
}
Wenn Sie das Programm ausführen, sehen Sie die genaue Reihenfolge, in der catchund finallyBlöcke ausgeführt werden. Beachten Sie, dass Code im finally-Block nach dem Auslösen der Ausnahme nicht ausgeführt wird (in diesem Beispielprogramm warnt Visual Studio Sie sogar, dass nicht erreichbarer Code erkannt wurde):
Ausnahme beim Behandeln des inneren Fangblocks vom Try-Block ausgelöst.
Inner endlich blockieren
Ausnahme für die Behandlung des äußeren Fangblocks, die vom endgültigen Block ausgelöst wird.
Außen endlich blockieren
Zusätzliche Bemerkung
Wie Michael Damatov betonte, wird eine Ausnahme vom tryBlock "gegessen", wenn Sie sie nicht in einem (inneren) catchBlock behandeln. Tatsächlich wird im obigen Beispiel die erneut ausgelöste Ausnahme nicht im äußeren Catch-Block angezeigt. Um dies noch deutlicher zu machen, schauen Sie sich das folgende leicht modifizierte Beispiel an:
using System;
class Program
{
static void Main(string[] args)
{
try
{
try
{
throw new Exception("exception thrown from try block");
}
finally
{
Console.WriteLine("Inner finally block");
throw new Exception("exception thrown from finally block");
Console.WriteLine("This line is never reached");
}
}
catch (Exception ex)
{
Console.WriteLine("Outer catch block handling {0}.", ex.Message);
}
finally
{
Console.WriteLine("Outer finally block");
}
}
}
Wie Sie aus der Ausgabe sehen können, ist die innere Ausnahme "verloren" (dh ignoriert):
Inner endlich blockieren
Ausnahme für die Behandlung des äußeren Fangblocks, die vom endgültigen Block ausgelöst wird.
Außen endlich blockieren