Undantag och undantagshantering

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 tredjepartsbibliotek 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 .

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("{0} divided by {1} = {2}", a, 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 try block runt de instruktioner som kan utlösa undantag.
  • När ett undantag inträffar i try blocket, hoppar kontrollflödet till den första associerade undantagshanteraren som finns var som helst i anropsstacken. I C# används nyckelordet catch fö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 lämna programmet i ett känt tillstånd. Om du fångar System.Exceptionkan du återväxa det med hjälp av nyckelordet throw i slutet av catch blocket.
  • Om ett catch block 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 uttryckligen 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 finally block körs oavsett om ett undantag utlöses. Använd ett finally block för att frigöra resurser, till exempel för att stänga alla strömmar eller filer som har öppnats i try blocket.
  • Hanterade undantag i .NET implementeras ovanpå win32-mekanismen för strukturerad undantagshantering. Mer information finns i Structured Exception Handling (C/C++) och A Crash Course on the Depths of Win32 Structured Exception Handling (Strukturerad undantagshantering).

C#-språkspecifikation

Mer information finns i Undantag i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.

Se även