Ausnahmebehandlung (C#-Programmierhandbuch)Exception Handling (C# Programming Guide)

Ein try-Block wird von C#-Programmierern verwendet, um Code zu partitionieren, der von einer Ausnahme betroffen sein könnte.A try block is used by C# programmers to partition code that might be affected by an exception. Zugeordnete catch-Blöcke werden verwendet, um die sich ergebenden Ausnahmen zu behandeln.Associated catch blocks are used to handle any resulting exceptions. Ein finally-Block enthält Code, der ausgeführt wird, unabhängig davon, ob eine Ausnahme im try-Block ausgelöst wird, z.B. das Freigeben von Ressourcen, die im try-Block zugeordnet werden.A finally block contains code that is run regardless of whether or not an exception is thrown in the try block, such as releasing resources that are allocated in the try block. Ein try-Block erfordert einen oder mehrere zugeordnete catch-Blöcke oder ein finally-Block oder beides.A try block requires one or more associated catch blocks, or a finally block, or both.

Die folgenden Beispiele zeigen eine try-catch-Anweisung eine try-finally-Anweisung und eine try-catch-finally-Anweisung.The following examples show a try-catch statement, a try-finally statement, and a try-catch-finally statement.

try
{
    // Code to try goes here.
}
catch (SomeSpecificException ex)
{
    // Code to handle the exception goes here.
    // Only catch exceptions that you know how to handle.
    // Never catch base class System.Exception without
    // rethrowing it at the end of the catch block.
}
try
{
    // Code to try goes here.
}
finally
{
    // Code to execute after the try block goes here.
}
try
{
    // Code to try goes here.
}
catch (SomeSpecificException ex)
{
    // Code to handle the exception goes here.
}
finally
{
    // Code to execute after the try (and possibly catch) blocks 
    // goes here.
}

Ein try-Block ohne einen catch- oder finally-Block verursachen einen Compilerfehler.A try block without a catch or finally block causes a compiler error.

catch-BlöckeCatch Blocks

Ein catch-Block kann den Typ der Ausnahme angeben, die abgefangen werden soll.A catch block can specify the type of exception to catch. Die Typspezifikation wird einen Ausnahmefilter aufrufen.The type specification is called an exception filter. Der Typ der Ausnahme sollte von Exception abgeleitet werden.The exception type should be derived from Exception. Im Allgemeinen sollten Sie Exception nicht als Ausnahmefilter angeben, sofern Sie nicht entweder alle Ausnahmen behandeln können, die möglicherweise im try-Block ausgelöst werden, oder Sie nicht eine throw-Anweisung am Ende des catch-Blocks eingeschlossen haben.In general, do not specify Exception as the exception filter unless either you know how to handle all exceptions that might be thrown in the try block, or you have included a throw statement at the end of your catch block.

Mehrere catch-Blöcke mit verschiedenen Ausnahmefiltern können miteinander verkettet werden.Multiple catch blocks with different exception filters can be chained together. Die catch-Blöcke werden von oben nach unten in Ihrem Code überprüft, aber nur ein catch-Block wird für jede Ausnahme, die ausgelöst wird, ausgeführt.The catch blocks are evaluated from top to bottom in your code, but only one catch block is executed for each exception that is thrown. Der erste catch-Block, der den exakten Typ oder eine Basisklasse der ausgelösten Ausnahme angibt, wird ausgeführt.The first catch block that specifies the exact type or a base class of the thrown exception is executed. Wenn kein catch-Block einen passenden Ausnahmefilter angibt, wird ein catch-Block, der über keinen Filter verfügt, ausgewählt, wenn einer in der Anweisung vorhanden ist.If no catch block specifies a matching exception filter, a catch block that does not have a filter is selected, if one is present in the statement. Es ist wichtig, catch-Blöcke mit den spezifischsten (d.h. am stärksten abgeleiteten) Ausnahmetypen als erstes zu positionieren.It is important to position catch blocks with the most specific (that is, the most derived) exception types first.

Sie sollten die Ausnahmen abfangen, wenn Folgendes zutrifft:You should catch exceptions when the following conditions are true:

  • Sie verstehen, warum die Ausnahme ausgelöst werden kann, und Sie können eine bestimmte Wiederherstellung implementieren, wie z.B. den Benutzer auffordern, einen neuen Dateinamen einzugeben, wenn Sie ein Objekt FileNotFoundException abfangen.You have a good understanding of why the exception might be thrown, and you can implement a specific recovery, such as prompting the user to enter a new file name when you catch a FileNotFoundException object.

  • Sie können eine neue und spezifischere Ausnahme erstellen und auslösen.You can create and throw a new, more specific exception.

    int GetInt(int[] array, int index)
    {
        try
        {
            return array[index];
        }
        catch(System.IndexOutOfRangeException e)
        {
            throw new System.ArgumentOutOfRangeException(
                "Parameter index is out of range.", e);
        }
    }
    
  • Sie möchten eine Ausnahme teilweise behandeln, bevor Sie sie für eine zusätzliche Behandlung weitergeben.You want to partially handle an exception before passing it on for additional handling. Im folgenden Beispiel wird ein catch-Block verwendet, um dem Fehlerprotokoll einen Eintrag hinzufügen, bevor die Ausnahme erneut ausgelöst wird.In the following example, a catch block is used to add an entry to an error log before re-throwing the exception.

    try
    {
        // Try to access a resource.
    }
    catch (System.UnauthorizedAccessException e)
    {
        // Call a custom error logging procedure.
        LogError(e);
        // Re-throw the error.
        throw;     
    }
    

Finally-BlöckeFinally Blocks

Mit einem finally-Block können Sie Aktionen bereinigen, die in einem try-Block ausgeführt werden.A finally block enables you to clean up actions that are performed in a try block. Falls vorhanden, wird der finally-Block zuletzt ausgeführt, nach dem try-Block und jedem übereinstimmenden catch Block.If present, the finally block executes last, after the try block and any matched catch block. Ein finally-Block wird immer ausgeführt, unabhängig davon, ob eine Ausnahme ausgelöst wird oder ein catch-Block gefunden wird, der mit dem Ausnahmetyp übereinstimmt.A finally block always runs, regardless of whether an exception is thrown or a catch block matching the exception type is found.

Der finally-Block kann zum Freigeben von Ressourcen verwendet werden, wie z.B. Dateistreams, Datenbankverbindungen und Grafikhandles, ohne Warten auf den Garbage Collector in der Laufzeit, um die Objekte zu beenden.The finally block can be used to release resources such as file streams, database connections, and graphics handles without waiting for the garbage collector in the runtime to finalize the objects. Weitere Informationen finden Sie unter using-Anweisung.See using Statement for more information.

Im folgenden Beispiel wird der finally-Block verwendet, um eine Datei, die im try-Block geöffnet ist, zu schließen.In the following example, the finally block is used to close a file that is opened in the try block. Beachten Sie, dass der Status des Dateihandles überprüft wird, bevor die Datei geschlossen wird.Notice that the state of the file handle is checked before the file is closed. Wenn der try-Block die Datei nicht öffnen kann, verfügt das Dateihandle immer noch über den Wert null, und der finally-Block versucht nicht, es zu schließen.If the try block cannot open the file, the file handle still has the value null and the finally block does not try to close it. Alternativ schließt der finally-Block die geöffnete Datei, wenn die Datei im try-Block erfolgreich geöffnet wird.Alternatively, if the file is opened successfully in the try block, the finally block closes the open file.

System.IO.FileStream file = null;
System.IO.FileInfo fileinfo = new System.IO.FileInfo("C:\\file.txt");
try
{
    file = fileinfo.OpenWrite();
    file.WriteByte(0xF);
}
finally
{
    // Check for null because OpenWrite might have failed.
    if (file != null)
    {
        file.Close();
    }
}

C#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee Also

C#-ReferenzC# Reference
C#-ProgrammierhandbuchC# Programming Guide
Ausnahmen und AusnahmebehandlungExceptions and Exception Handling
try-catchtry-catch
try-finallytry-finally
try-catch-finallytry-catch-finally
Using-Anweisungusing Statement