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
, catch
och 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 nyckelordetcatch
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.Exception
kan du återväxa det med hjälp av nyckelordetthrow
i slutet avcatch
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 ettfinally
block för att frigöra resurser, till exempel för att stänga alla strömmar eller filer som har öppnats itry
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.