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 catch
und finally
Blö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 try
Block "gegessen", wenn Sie sie nicht in einem (inneren) catch
Block 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