login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > Gecombineerd


Gegevens:
Geschreven door:
Abbas
Moeilijkheidsgraad:
Normaal
Hits:
6026
Punten:
Aantal punten:
 (3)
Aantal stemmen:
2
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (4)
 

Tutorial:

Exception Handling

1. Inleiding
2. Zonder Exception Handling
3. Verschillende soorten Exceptions
4. Voorbeeld met Exception Handling
5. Extra voorbeeldje (DivideByZeroException)



1. Inleiding

Exception Handling is een methode om een situatie op te vangen wanneer de uitvoer van code niet normaal is.
Bij het uitvoeren van een bepaald stuk code of bij het communiceren met een server kan er al eens iets mis gaan.
Denk maar aan het uitvoeren van een query, het uploaden van files, ingewikkelde stukken code...
Om een lelijke fouten - pagina tegen te gaan kan men de fout opvangen en op een nette manier de opgetreden fout weergeven.

pijl top


2. Zonder Exception Handling

Als voorbeeld gebruik ik hier de uitvoer van een query die zal uitgevoerd worden zonder Exception Handling en laat ik zien wat er gebeurt als er iets mis gaat.
Stel je hebt een query, je stelt een SQL - command in en voert die uit:

C# VB
SqlConnection verbinding = new SqlConnection("...");
//... omdat de connectionstring even niet terzake doet
string query = "SELECT plaats FROM leden WHERE id = 100";
SqlCommand commando = new SqlCommand(query, verbinding);
SqlDataReader lezen;
string naam;

verbinding.Open();
lezen = commando.ExecuteReader();
while (lezen.Read())
{
   naam = lezen.GetString(0);
}
lezen.Close();
verbinding.Close();
Dim verbinding As SqlConnection = New SqlConnection("...")
'... omdat de connectionstring even niet terzake doet
Dim query As String = "SELECT plaats FROM leden WHERE id = 100"
Dim commando As SqlCommand = New SqlCommand(query, verbinding)
Dim lezen As SqlDataReader
Dim naam As String

verbinding.Open()
lezen = commando.ExecuteReader()
While lezen.Read()
   naam = lezen.GetString(0)
End While
lezen.Close()
verbinding.Close()

Maar stel dat de kolom "plaats" waaruit je gegevens wilt halen niet bestaat, dan krijg je iets als dit op je scherm:



Dit oogt niet mooi, en zeker niet als een bezoeker dit te zien zou krijgen als hij/zij je site bezoekt.
We lossen dit probleem om met Exception Handling!

pijl top


3. Verschillende soorten Exceptions

Om de eventuele fouten te kunnen opvangen moet je werken met een try-catch-finally blok.
try: hierin zet je de code die zou moeten uitgevoerd worden, maar waar eventueel fouten kunnen voorkomen.
catch: de eventuele fout die zich kan voordoen hier opvangen.
finally: de code die moet uitgevoerd worden, ongeacht of er fouten zijn opgetreden of niet.
Het blok:

C# VB
try
{
 // uit te voeren code
}
catch (type_exception X)
{
 //X = naam van de fout
 //hier iets mee doen (weergeven)
}
finally

{
 // code die nog uitgevoerd wordt
}

Try
 ' uit te voeren code
Catch X As type_exception
 'X = naam van de fout
 'hier iets mee doen (weergeven)
Finally
 ' code die nog uitgevoerd wordt
End Try


Er zijn verschillende types Exceptions. Hier zijn er enkele veelgebruikte/voorkomende:

- OleDbException
- SqlException
- DivideByZeroException
- OverflowException
- OutOfMemoryException
- Exception (Geen specifieke)

Bij de Exception hoort een bericht met wat er precies misgegaan is. Ook dat kunnen we verkrijgen.
Je wilt bijvoorbeeld het bericht weergeven dat bij de fout hoort.
C# VB
catch (type_exception x)
{
Response.Write(x.Message)
}

Catch x As type_exception
Response.Write(x.Message)
Hieronder volgt het voorbeeld van daarnet maar dan MET Exception Handling om het wat duidelijker te maken!

pijl top


4. Voorbeeld met Exception Handling

We gebruiken nu dezelfde code als in het eerste voorbeeld, maar nu met de Exception Handling. Onze code ziet er nu zo uit:

C# VB
SqlConnection verbinding = new SqlConnection("Data Source=.\SQLEXPRESS; AttachDbFileName=H:\C#\Highlight\App_Data\Database.mdf; Integrated Security = True; User Instance = True");
       
       string query = "SELECT plaats FROM leden WHERE id = 1";
       SqlCommand commando = new SqlCommand(query, verbinding);
       SqlDataReader lezen;
       string naam = "";

       try
       {
           verbinding.Open();
           lezen = commando.ExecuteReader();
           while (lezen.Read())
           {
               naam = lezen.GetString(0);
           }
           lezen.Close();
       }
       catch (Exception x)
       {
           Response.Write(x.Message);
       }
       finally
       {
           verbinding.Close();
       }

Dim verbinding As SqlConnection = new SqlConnection("Data Source=.\SQLEXPRESS; AttachDbFileName=H:\C#\Highlight\App_Data\Database.mdf; Integrated Security = True; User Instance = True")
       
       Dim query As String = "SELECT plaats FROM leden WHERE id = 1"
       Dim commando As SqlCommand = new SqlCommand(query, verbinding)
       Dim lezen As SqlDataReader
       Dim naam As String = ""

       Try
           verbinding.Open()
           lezen = commando.ExecuteReader()
           While lezen.Read()
               naam = lezen.GetString(0)
           End While
           lezen.Close()
       Catch x As Exception
           Response.Write(x.Message)
       Finally
           verbinding.Close()
       End Try

Kijk goed naar de code, het sluiten van de verbinding staat in het finally blok. Het openen van de verbinding gebeurt zoizo,
Maar als er een fout optreedt en het sluiten van de verbinding staat onderaan in het try-blok,
dan zal deze niet gesloten worden bij het optreden van een fout.
Zorg er dus voor dat het sluiten ervan in het finally-blok staat, zodat ze gesloten wordt,
of er nu iets fout gaat of niet! De kolom "plaats" bestaat niet maar nu krijgen we enkel bovenaan de pagina dit te zien:



pijl top


5. Extra voorbeeldje (DivideByZeroException)

In dit voorbeeld gaan we een getal delen door 0 en gebruiken we niet de algemene "Exception", maar de "DivideByZeroException".
Het eerste stuk code is zonder de Handling.
C# VB
protected void Page_Load(object sender, EventArgs e)
   {
       int x = 4;
       int y = 0;
       int z = x / y;
       Response.Write(z.ToString());
   }
Protected Sub Page_Load(Sender As object sender, E As EventArgs)
       Dim x As Int = 4
       Dim y As Int = 0
       Dim z As Int = x / y
       Response.Write(z.ToString())
End Sub

Dit zal ook weer een lelijke foutenpagina geven, het zal er uitzien zoals dit:



Met de Exception Handling ziet de code er zo uit:

C# VB
protected void Page_Load(object sender, EventArgs e)
   {
       int x = 4;
       int y = 0;

       try
       {
           int z = x / y;
           Response.Write(z.ToString());
       }
       catch (DivideByZeroException X)
       {
           Response.Write(X.Message);
       }
   }
Protected Sub Page_Load(Sender As object, E As EventArgs)
   Dim x As Int = 4
   Dim y As Int = 0

   Try
       Dim z As Int = x / y
       Response.Write(z.ToString())
   Catch X As DivideByZeroException
       Response.Write(X.Message)
   End Try
End Sub

Dat geeft mooi deze melding:



Ik denk dat dit veel netter is! Zo ik hoop dat ik jullie weer een interessant / nuttig stukje heb kunnen bijbrengen vanuit de .NET wereld. Indien er vragen of opmerkingen zijn, laat dit dan gerust weten. Voor de leden: stem aub, zo heb ik een idee van wat jullie vinden.

pijl top


Volgende tutorial : Cookies »

© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.017s