Felhantering - tekniker alla bör lära sig
Förord
Det är väldigt många som håller på att frågar om vanliga fel, med all rätt. Innan man kommit igång är det inte så himla lätt. Till skillnad från Visual Basic så får man felen presenterade direkt men så är inte fallet i ASP. Att göra en bra felsökning kan vara svårt även för den med stor erfarenhet. Nedan följer några tips som kan vara bra att lägga på minnet för att minska antalet fel och försöka tolka och rätta till innan det händer.Innehåll
»»
»
»
Relaterade artiklar
» Felhantering - felsökning runt databaserFelsökning i ASP - hur går det till?
Det finns egentligen tre saker som vanligtvis går fel när man skriver asp-program. Givetvis finns det 100-tals sätt att göra fel på men om man delar in dessa i grupperingar så blir det inte så många typer av fel. De grundläggande felen är följande:
- Ett syntaxfel som skrivits då du antingen skriver ren asp-kod eller infogar den i befintlig html
- Ett syntaxfel i en komponent som du skrivit eller köpt och anropar
- Ett syntaxfel eller felaktig sammansatt databasfråga
För att gardera sig emot detta så måste man i första läget få reda på vilket fel det är och framför allt på vilken rad detta fel uppstår. I Internet explorer finns en inställning i verktyg|internet alternativ|avancerat som heter visa egna HTTP- felmeddelanden - och det ställer till det för de flesta nya utvecklarna. När ett fel uppstår på din sida så visas ett 500-fel, utan kommentarer om vad som gått fel. Om du bockar bort detta alternativ och får fel igen så kommer det vara stor skillnad.
Teknisk information (för supportpersonal)
Feltyp:
Körningsfel i Microsoft VBScript (0x800A01B6)
Objektet stöder inte egenskapen eller metoden.: 'debug.print'
/test.asp, line 3
Webbläsare:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Sida:
GET /xxx.asp
Ovan ser du ett korrekt felmeddelande. Här meddelas först att det är ett körningsfel, dess felnummer och orsaken till felet. Vi tittar lite på de förstnämnda orsakerna:
- Feltyp:
Här får du reda på felkoden. 0x800A01B6 - denna kod är ju givetvis kryptisk men det går faktiskt att söka på den på internet och få fram svaret på vad dessa olika koder betyder. Ta alltid för vana att om du inte kan tyda vad felet beror på - använd då din sökmotor och leta efter den koden.
- Felmeddelande:
Felet som presenteras här är att egenskapen eller metoden debug.print inte finns. Det stämmer i detta fall eftersom Debug.Print kan man bara skriva i Visual Basic. Titta alltid noga på detta felmeddelande och försök tyda det
- Radnummer:
test.asp, line 3 - på rad 3 i din programkod står detta felet och det gäller test.asp. Här gäller det också att vara vaksam. Använder du en include-fil som är en asp-fil kan faktiskt include-filens namn stå där och då kan du luras att felet är på den sida du ändrat istället för includefilen.
- Övrig information:
Den övriga informationen brukar jag aldrig ha någon nytta av och tror inte heller ni behöver veta det för er felsökning såvida du inte bygger en sida som är anpassad till olika webbläsare och är beroende av att veta vilken som genererat felet.
För att rätta till detta felet så får du i stället för Debug.Print ange det korrekta kommandot som finns i ASP - nämligen Response.Write så löser sig detta problem och programmet körs och visas ordentligt.
Info
Om du har script-debuggern på så visas även den rad som går fel. Där visas koden direkt och gör det möjligt för dig att kanske enklare se vilken rad programmet fått ett fel på. Script-debuggern installeras vanligtvis om man har Visual Studio på sin dator.
Brutna strängar
Ofta i ASP så bygger man strängar för att senare presentera detta på htmlsidan. Ett exempel kan vara att du skall skriva en liten rutin för att göra en länk som byggs upp dynamiskt. Ett exempel kan vara:
Teknisk information (för supportpersonal)
Feltyp:
Kompileringsfel i Microsoft VBScript (0x800A0401)
Slut på programsats förväntas.
/xxx.asp, line 3, column 20
strLink = "Klicka här"
---------------------^
Som ni ser här så pekar felhanteraren ut för oss att vi har gjort ett fel vid en viss position, rad 3 - position 20. Först å främst är detta ett nybörjarfel, men jag kan garantera er - även vana gör fel på detta. Här är det så att om vi tittar ordentligt på " som används för att bygga en sträng så börjar den på position 11 och slutar på 20, det som står efter " är http och det blir ju fel. För att göra detta korrekt kan du använda följande regel:
Om vi tar ett exempel:
strLink = "Klicka här"
Ersätt då de 2 inre "" med dubbla - så kommer dina problem vara ur världen:
strLink = "< href=""http://localhost"">Klicka här"
Kom i-håg
Alla " som förekommer i en sträng du bygger, skriv två stycken "" i stället så undviker du problemet. Det finns även ett alternativ att använda ' och går precis lika bra.
Använda variabler/objekt
Nu har vi tittat på syntaxfel och likaså fel sammansättningar av en sträng. Nästa problem som ofta dyker upp är att du skall använda dig av någon variabel men av någon anledning så fungerar det inte som du tänkt dig. Även här finns det några vanliga fel som förekommer.
- 1. Du skall hämta ett värde från sidan du laddar (en textbox) men inget kommer
- 2. Du hämtar ett värde från en variabel skapad på sidan, du laddar om men värdet finns inte
- 3. En disablad textruta med ett värde går inte att hämta ut.
- 4. Du får inte en sessions värde att finnas när du skall använda det
- 5. Du får in ett kommatecken och ett annat värde från din textbox
1. Om vi tittar på scenario 1 så har du en textbox med namnet förnamn. När du i din kod försöker hämta värdet med request.form("förnamn") så kommer ingenting fram. Felet i detta läge beror troligast på att du missat lagt denna textbox innanför <form> taggen. Allt som finns utanför en form-tagg kommer inte att kunna hämtas upp.
2. Om du skriver kalle=100 och sedan laddar om sidan så fungerar det inte. Antingen måste kalle placeras som en hidden-tagg i en form alternativt finnas med i en url för att det skall kunna hämtas upp.
3. Alla textrutor eller kontroller som har disabled som egenskap går inte att läsa om sidan submittas. För att lösa detta får du samtidigt lägga dess värde i en hiddentagg eller skicka med det i en url.
4. En session lever kvar så länge den skapats och användaren använder samma domän och har fönstret öppet. Om du stänger din webbläsare dör sessionen. På samma sätt friställs alla sessionsobjekt med Session.Abandon. Det är också viktigt att påpeka att en session kan inte skapas om din webbläsare inte tillåter cookies. Jag har hört flera klaga på Nortons Antivirusprogram som ställer till det med cookies- så var observant där.
5. Har du två kontroller med samma namn och kör en request kommer dessa separeras med ett , tecken. För att undvika detta - döp om en av kontrollerna så slipper du problemet.
Som du ser ovan så finns det flera felkällor som kan ställa till det för dig. Se till att du inte missat något av detta.
Request på olika sätt
Om du har en txtid som heter kalle samt en url som är txtid så kommer du givetvis få problem. Det första som dyker upp är om dessa är olika och du behöver använda dig av båda och till råga på allt måste ha samma namn. För att lösa detta så är det som så att om du skriver:
txtid = Request("txtid")
Här får du in txtid men ett problem uppstår. Är det från URL eller formen?. Svaret är att i detta fall hämtas båda värdena. Har du 12 i Form och 17 i URL så kommer txtid bli (17,12) - alltså två värden placeras efter varandra. Om du inte anger något är det URL värdet som hämtas i första hand om man bara skriver Request. För att specificera vilket värde som skall hämtas måste du ange källan:
txtid1 = Request.Form("txtid") ' Form
txtid2 = Request.QueryString("txtid") ' URL
På detta sätt har du eliminerat dina problem och behöver inte vara orolig för var som skall ske. Här kan även inflikas att om du har en lösenordssida och skall skicka användarnamn och lösenord i textboxar och inte hämtar det med Request.Form - så kan du lika gärna skriva i din URL:
http://localhost/login.asp?username=Pelle&password=123
Systemet kommer hämta informationen precis som det hade skrivits på formuläret - men det var inte riktigt så det var tänkt.
0 Kommentarer