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.
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!
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!
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:
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.
top
|