4120 Exceptions undantag

Du har troligtvis råkat ut för att något av de program som du har skrivit avslutas med att ett undantag kastas (eng. throw exception). Exempel på undantag är IndexOutOfRangeException och NullReferenceException, se bilderna nedan.

I första hand ska man försöka koda så att undantag inte kastas. Koden i bilderna kan ändras så att undantag inte kastas.

Exempelkoden i bilderna finns på GitHub, hela projektet.

Att hantera undantag med try catch

I vissa fall går det dock inte att skriva kod så att man kan garantera att undantag inte kastas. Ett exempel på en sådan situation är filhantering. Det kanske inte går att skriva till en fil för att hårddisken är full.

För att undvika att programmet kraschar då ett undantag kastas kan man fånga felet och vidta lämplig åtgärd.

Kod för try catch

try
{
  // denna kod körs alltid
  // kod som riskerar att kasta undantag
}
catch (Exception e)
{
  // denna kod körs om ett undantag har kastats
  // vidta åtgärd
}

Exempel på IndexOutOfRangeException

Undantag hanterat med try catch

Bör inte hanteras med try catch, men görs för att demonstrera try catch.

int[] numbers = { 36, 34, 39, 41 };

for (int i = 1; i <= 4; i = i + 1)
{
  try
  {
    Console.WriteLine(numbers[i]);
  }
  catch (IndexOutOfRangeException e)
  {
    Console.WriteLine("index i = " + i + " not in use");
    Console.WriteLine(e.Message);
  } 
}

Exempel på NullReferenceException

Undantag hanterat med try catch

Bör inte hanteras med try catch, men görs för att demonstrera try catch.

string[] shoppingList = new string[3];

shoppingList[0] = "milk";
shoppingList[2] = "butter";

// search for eggs
foreach(string item in shoppingList)
{
  try
  {
    if (item.Equals("eggs"))
    {
      Console.WriteLine("found egg");
    }
  }
  catch (NullReferenceException)
  {
    // empty place in list
  }

}

Variationer på try catch

// Nedan är Exception överklass till GeneralException 
// som i sin tur är överklass till SpecificException
try
{
  // gör något
}
catch (SpecificException e)
{
  // fångar SpecificException
}
catch (GeneralException e)
{
  // fångar GeneralException och
  // andra undantag som ärver från GeneralException
}

try catch finally

try
{
  // gör något
}
catch (Exception)
{
  // kod körs då undantag fångas
}
finally
{
  // kod körs alltid
}

Klasshierarki med undantag

Alla undantagsklasser är ej med i figuren nedan.

Mer om undantagshantering

Exceptions and Exception Handling (C# Programming Guide), Microsoft

Exception Handling (C# Programming Guide), Microsoft

try-catch (C# Reference), Microsoft

try-catch-finally (C# Reference), Microsoft