Virhekäsittely
Yksinkertainen virhekäsittely koodataan seuraavasti:
try
{
//virheille altista koodia
}
catch(System.Exception ex)
{
MessageBox.Show("Tapahtui virhe: " + ex.Message);
}
Exception -luokan jäseniä ovat mm.
- Message = virheen selite
- ToString() tulostaa myös kutsupinon
- InnerException = binääripuu virheistä
- GetBaseException palauttaa virhepuun ensimmäisen virheen
Exception luokasta on myös peritty tarkempia virheluokkia kuten ArithmeticException,
IndexOutOfRangeException, InvalidCastException jne...
Myös luokka ApplicationException on peritty luokasta Exception. ApplicationException
luokan avulla on tarkoitus käsitellä sovelluksen omia keskeytysluokkia.
Voit haarautua eri käsittelijään riippuen virheestä seuraavasti:
try
{
string j = "k";
int i = (3/int.Parse(j));
//int i = 3/0; //aiheuttaisi haarautumisen DivideByZeroException:iin
}
catch(DivideByZeroException dex)
{
MessageBox.Show("Tapahtui nollalla jakovirhe: " + dex.Message);
}
catch(System.FormatException fex)
{
MessageBox.Show("Tapahtui formatointivirhe: " + fex.Message);
}
Toisaalta voidaan "nostattaa" virhe throw:lla seuraavasti:
try
{
string j = "4"; //muuta "4" esim. "merkkijono"
if( int.Parse(j).GetType() != System.Type.GetType("System.Int32"))
throw new System.FormatException(); //nostetaan virhe
int i = (3/int.Parse(j));
}
catch(DivideByZeroException dex)
{
MessageBox.Show("Tapahtui nollalla jakovirhe: " + dex.Message);
}
catch(System.FormatException fex)
{
MessageBox.Show("Tapahtui formatointivirhe: " + fex.Message);
}
Resurssien vapautus
Jos sovelluksessa käytetään resursseja jotka pitää vapauttaa tapahtui virhe tai ei toimitaan seuraavasti:
try
{
//esim. aukaistaan tiedosto
}
catch(System.Exception ex)
{
MessageBox.Show("Tapahtui virhe: " + ex.Message);
}
finally
{
//tämä suoritetaan tapahtui virhettä tai ei
//siis tässä suljetaan tiedosto
}
Laajemmissa sovelluksissa kannattaa yleensä tehdä omat poikkeusluokat perimällä ne .NET:n poikkeusluokista.