Programmeren in ASP.NET/Foutzoeken
Vooraleer we verder gaan, is het goed al iets meer te weten over de mogelijkheden in ASP.NET om fouten op te sporen (het zogenaamde "debuggen").
ASP.NET-pagina's debuggen
bewerkenComputers zijn domme machines: ze doen alleen maar wat je vraagt. Als je verkeerde opdrachten geeft, zal de computer dikwijls toch proberen ze uit te voeren, met alle mogelijke gevolgen. Vooraleer we verder gaan, is het interessant om eerst meer te weten over hoe je fouten kan opsporen in je pagina's. Er zijn twee soorten fouten: compileerfouten en runtime-fouten.
- Compileerfouten treden op tijdens het compileren van de code (het controleren op taalfouten en het vertalen naar uitvoerbare code). Zo krijg je bijvoorbeeld een fout als je een If-statement gebruikt zonder het bijhorende End If-statement.
Als je de pagina bekijkt via localhost (dus op je eigen pc), dan wordt de regel waarin de fout is aangetroffen in de pagina weergegeven met enkele omliggende regels. Verder wordt gemeld wat de fout is. Met deze informatie kan je bepalen waardoor de fout optreedt en dit aanpassen. Gewone gebruikers, die de pagina van op afstand (remote) bekijken, krijgen een algemene foutboodschap (tenzij je speciale instellingen gebruikt). - Runtime-fouten treden op terwijl de pagina uitgevoerd wordt (na het compileren). Er kan dan een situatie ontstaan waarbij het programma niet meer verder kan, bijvoorbeeld als je probeert deze code uit te voeren:
Dim i As Integer = "test"
Dan wordt om veiligheidsredenen alleen een algemene foutmelding getoond. Tijdens de ontwikkelfase van je website is dit over het algemeen echter niet voldoende om de fout te kunnen oplossen, en wil je graag de regels code zien die de fout veroorzaken. Je kan ervoor zorgen dat de regels code wel worden weergegeven door dit in de pagina-declaratie aan te geven, als volgt:
<%@ Page Debug="true" %>
Je kan dit ook voor de hele website of voor een bepaalde subfolder inschakelen door het configuratiebestand web.config aan te passen. Het voorbeeld hieronder zorgt ervoor dat de foutieve code voor alle pagina's getoond wordt (tenzij in de pagina zelf anders aangegeven met Debug="false"). web.config
<configuration> <system.web> <compilation debug="true"/> </system.web> </configuration>
Wil je ook de fouten kunnen zien vanaf een andere client (remote), dan voeg je ook nog de volgende regel toe:
<customErrors mode="Off" />
Wijzigingen in web.config worden opgepikt zodra de eerstvolgende pagina opgevraagd wordt.
Let op: web.config is een XML-bestand, en XML is hoofdlettergevoelig!
Zeer belangrijk: vergeet niet het debug-attribuut te verwijderen op het moment dat je applicatie volledig getest is en online gaat (de zogenaamde release-versie).
Trace gebruiken
bewerkenTracing is het volgen van een programma terwijl het uitgevoerd wordt. Als een pagina niet goed werkt, of fouten vertoont, dan is het handig om te kunnen zien hoe de pagina opgebouwd wordt en wat de staat is van de pagina en de aanvraag. Door de volgende declaratie bovenin je pagina te plaatsen krijg je onderaan de pagina allerhande informatie over de verwerking van de pagina te zien.
<%@ Page Trace="true" %>
Ook dit kan je voor de hele website aan- of uitzetten. Je kan daarbij onder andere opgeven of de trace-informatie alleen lokaal zichtbaar is, of ook voor externe webbrowsers. In het web.config-bestand hieronder is de trace-informatie alleen lokaal zichtbaar:
<configuration> <system.web> <trace enabled="true" localOnly="true"/> </system.web> </configuration>
Als je tracing aan hebt staan, kan je ook de trace-informatie van de laatste 10 opgevraagde pagina's in de website bekijken. Dit kan handig zijn als een fout niet iedere keer optreedt en je wilt vergelijken tussen de verschillende aanvragen. Dit doe je door in de url de naam van de pagina eenvoudig te vervangen door "trace.axd". Verder is er ook nog een TraceContext-object dat je kan gebruiken via de eigenschap Trace van het Page-object. Dit object heeft enkele methodes zoals Warn() en Write(), waarmee je zelf informatie in de Trace output kan zetten. Dit helpt je om de toestand van je programma te kennen zonder in de pagina zelf in te grijpen. Bijvoorbeeld:
If (fout) Then Trace.Warn("Er gebeurde een fout in regel ... ") End If
of:
Trace.Write(i) ' toont de waarde van de variabele i op deze plaats in de code
Vergeet natuurlijk weer niet om tracing weer af te zetten in de release-versie. De bovenstaande coderegels met Trace.Warn en Trace.Write mag je wel laten staan: als tracing afstaat hebben ze geen enkel effect.
Debuggen vanuit de editor
bewerkenCode kan naast compilerfouten en runtime-fouten nog een derde soort fouten bevatten: logische fouten. Deze fouten zorgen ervoor dat een programma wel normaal doorgaat, maar verkeerde resultaten geeft.
In dit geval kan het soms zeer moeilijk zijn de plaats van de fout te vinden, omdat het programma zelf de fout niet aangeeft.
Visual Web Developer Express heeft een ingebouwde debugger waarmee je een programma stap voor stap kan doorlopen, en op die manier het verloop kan controleren.