Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
C#-språkets undantagshanteringsfunktioner hjälper dig att hantera oväntade eller exceptionella situationer som inträffar när ett program körs. Undantagshantering använder nyckelorden try, catchoch finally för att prova åtgärder som kanske inte lyckas, för att hantera fel när du bestämmer dig för att det är rimligt att göra det och för att rensa resurser efteråt. Undantag kan genereras av CLR (Common Language Runtime), av .NET eller bibliotek från tredje part eller av programkod. Undantag skapas med hjälp av nyckelordet throw .
I många fall kan ett undantag genereras inte av en metod som koden har anropat direkt, utan av en annan metod längre ned i anropsstacken. När ett undantag utlöses kommer CLR att varva ned stacken och leta efter en metod med ett catch block för den specifika undantagstypen, och den kör det första sådana catch blocket som hittas. Om det inte hittar något lämpligt catch block någonstans i anropsstacken avslutas processen och ett meddelande visas för användaren.
I det här exemplet testar en metod för division med noll och fångar upp felet. Utan undantagshanteringen skulle det här programmet avslutas med ett DivideByZeroException-fel som inte hanterades.
public class ExceptionTest
{
    static double SafeDivision(double x, double y)
    {
        if (y == 0)
            throw new DivideByZeroException();
        return x / y;
    }
    public static void Main()
    {
        // Input for test purposes. Change the values to see
        // exception handling behavior.
        double a = 98, b = 0;
        double result;
        try
        {
            result = SafeDivision(a, b);
            Console.WriteLine($"{a} divided by {b} = {result}");
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}
Översikt över undantag
Undantag har följande egenskaper:
- Undantag är typer som alla i slutändan härleds från System.Exception.
- Använd ett tryblock runt de satser som kan generera undantag.
- När ett undantag inträffar i tryblocket, hoppar kontrollflödet till den första associerade undantagshanteraren som finns var som helst i anropsstacken. I C# används nyckelordetcatchför att definiera en undantagshanterare.
- Om det inte finns någon undantagshanterare för ett visst undantag slutar programmet att köras med ett felmeddelande.
- Fånga inte ett undantag om du inte kan hantera det och se till att applikationen lämnas i ett känt tillstånd. Om du fångar System.Exception, kan du kasta om det med hjälp av nyckelordetthrowi slutet av blocketcatch.
- Om ett catchblock definierar en undantagsvariabel kan du använda den för att få mer information om vilken typ av undantag som inträffade.
- Undantag kan genereras explicit av ett program med hjälp av nyckelordet throw.
- Undantagsobjekt innehåller detaljerad information om felet, till exempel tillståndet för anropsstacken och en textbeskrivning av felet.
- Kod i ett finallyblock körs oavsett om ett undantag utlöses. Använd ettfinallyblock för att frigöra resurser, till exempel för att stänga strömmar eller filer som har öppnats itryblocket.
- Hanterade undantag i .NET implementeras ovanpå mekanismen för hantering av win32-strukturerade undantag. Mer information finns i Structured Exception Handling (C/C++) och A Crash Course on the Depths of Win32 Structured Exception Handling (Strukturerad undantagshantering).
Språkspecifikation för C#
Mer information finns i Undantag i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.