Bestimmen Sie, ob die Ausführung im finally-Block aufgrund einer ausgelösten Ausnahme erfolgt.

Ist es möglich festzustellen, ob der Code gerade im Kontext eines @ ausgeführt wirfinallyhandler als Ergebnis eines Ausnahmefalls? Ich benutze lieber dasIDisposable -Muster zum Implementieren der Eingabe- / Ausgabebereichsfunktionalität. Ein Problem mit diesem Muster besteht jedoch darin, dass Sie möglicherweise nicht möchten, dass das Verhalten am Ende des Gültigkeitsbereichs auftritt, wenn im Hauptteil von @ eine Ausnahme auftritusing. Ich würde so etwas suchen:

public static class MyClass
{
    public static void MyMethod()
    {
        using (var scope = MyScopedBehavior.Begin())
        {
            //Do stuff with scope here
        }
    }
}

public sealed class MyScopedBehavior : IDisposable
{
    private MyScopedBehavior()
    {
        //Start of scope behavior
    }

    public void Dispose()
    {
        //I only want to execute the following if we're not unwinding
        //through finally due to an exception:
        //...End of scope behavior    
    }

    public static MyScopedBehavior Begin()
    {
        return new MyScopedBehavior();
    }
}

Es gibt andere Möglichkeiten, dies zu erreichen (einen Delegaten an eine Funktion übergeben, die den Anruf mit einem bestimmten Verhalten umgibt), aber ich bin gespannt, ob es möglich ist, dies mit dem @ zu tuIDisposable Muster

Eigentlich wurde dies anscheinend gefragt und beantwortet, bevorHie. Es ist möglich, auf eine sehr hackische Art und Weise zu erkennen. Ich würde diese Technik eigentlich nicht anwenden, aber es ist interessant zu wissen, dass es möglich ist.