Bygg en egen 500 - internal server error sida
Förord
Precis som föregående artikel rörande felkod 404 - "page not found" så tänkte jag även visa hur du kan bygga en egen sida för 500-fel, med andra ord fel i ditt program, en modul, ett fel från databas eller från någon komponent. Som du även sett här på pellesoft så förekommer en speciell sida som visar vad det är för fel, på vilken rad och vilket kommando som körts för att orsaka felet. Många som bedriver egna hemsidor kanske inte övervakar sin site hela tiden och som jag, lyckligtvis har väldigt aktiva medlemmar - behöver någon form av stöd för att få reda på vad som går fel på hemsidan.Innehåll
»»
»
»
»
»
»
Relaterade artiklar
» Bygg en egen 404 - file not found sidaVarför egen 500-sida?
Ett exempel på varför en egen 500.asp sida är såbra var att då pellesoft nyttjar Index Server för att kunna söka på information här stängdes av, då fick jag mail om att index-servern inte var igång och kunde därmed snabbt åtgärda felet utan att jag själv testade eller att någon sa till mig.
Bygga en egen 500-sida
Som jag nämnde i tidigare artikeln rörande 404-sidan, så börjar man med att göra en egen helt vanlig asp-sida där designen matchar övriga sajten. Det vi nu skall ta och gå igenom är hur vi fångar felen, vilka fel vi kan fånga och slutligen hur vi gör det.Vi sätter direkt igång och tittar på felhanteringskomponenten som finns inbyggd i IIS5. Först tar vi oss en titt på den som finns här, så ser du hur en mall kan se ut: 500.asp. På denna sida ser du inte några fel för närvarande och det beror på att inget fel uppstått.
Till skillnad från IF Err <> 0 Then så skall du inte göra på samma sätt här. I stället skall vi använda det inbyggda objektet i ASP som heter Server.GetLastError().
Från detta objekt får vi reda på följande:
- Felnummer
- Vilken asp-kod som genererat felet
- En förklaring på felet
- Vilken kategori felet består av
- Vilken asp-sida det berörde
- Vilken rad felet uppstod på
- Vilken rads kolumn felet uppstod på
- En förklaring på felet om det var ASP-kod
Nu tänker du givetvis att detta var mycket information, och hur används nu detta. Först måste vi komma överrens om att du inte behöver ha någon felhantering på dina aktuella sidor, inte heller att använda denna sida genom att inkludera denna, utan helt enkelt låta sidan vara fristående.
Hur visas då sidan?
När eller om du får ett fel på någon av sidorna så förstår IIS att ett felmeddelande skall presenteras. Det som händer är att den letar efter standardsidan och skriver 500 - Internal Error och detaljer. Det vi nu skall göra är att skapa en precis likadan tjänst fast vi nyttjar vårt asp-objekt för detta. Vi börjar med att titta på hur vi instansierar objektet:
Dim objError
Set objError = Server.getLastError()
Vi instansierar nu ASP felhantering genom att ge objError en referens. I och med detta så fylls detta objekt med de felmeddelanden som sidan hade och vi kan börja plocka ut informationen.
strFelnr = objError.Number
strNumber = objError.AspCode
strText = objError.ASPDescription
strSource = objError.Category
strPage = objError.File
strDesc = objError.Description
strCode = Server.HTMLEncode(objError.Source)
If strCode = "" then strCode = "Kod saknas"
strLine = ObjError.Line
strCol = objError.Column
strASPDesc = ObjError.ASPDescription
Jag förklarade kort motsvarande parametrar tidigare och de är relativt självförklarande vad de innehåller med ett undantag, .Description och .ASPDescription. Skillnaden mellan dessa är att om felet är relaterat till ett syntaxfel i din vbscript-kod så är det ASPDescription som fylls med förklaring om felet. Är det exempelvis en komponent eller databasen som genererat ett fel, då är det .Description som fylls.
Vem utlöste felet?
Om du exempelvis har fler servrar och du vill veta vilken server det är , eller kanske vem på företaget det är som utlöste felet så kan du med objektet .ServerVariables hämta ut de ip-adresser som berörs. Detta gör du enklast som följer:
strRemoteAddr = Request.ServerVariables("REMOTE_ADDR")
strRemoteHost = Request.ServerVariables("REMOTE_HOST")
strLocalAddr = Request.ServerVariables("LOCAL_ADDR")
Remote_addr är den ipadress för vilken dator koden finns på. Remote_Host är hostnamnet. Slutligen local_addr är den lokala ip-adress som användaren har som fick eller utlöste felet.
Avslutningsvis måste vi enligt god sed alltid frigöra de objekt som vi instansierat och använder på vår sida för att undvika att onödigt minne tas upp.
Set objError = Nothing
Om du nu tar denna kod och lägger den på din sida och sedan visar upp det så har du all tillgänglig information du behöver för att lokalisera var felet uppstod, när, på vilken sida och av vem.
Lagra felet i databas
Jag lagrar faktiskt alla felen som uppstår i en tabell på min databas och övervakar dessa med jämna mellanrum. Min tabell som jag döpt till LOG innehåller följande två fält: feldatum (datetime) samt feltext (ntext, eller memo).När jag som ovan samlat på mig denna information skriver jag bara ner detta med en insert-sats till databasen som ett vanligt sql-kommando. Nedan ser du att jag öppnar Application("DSN"). Denna variabel innehåller min connectionsträng som jag skapade i global.asa
Set Con=Server.CreateObject("adodb.connection")
Con.Open Application("DSN")
Con.Execute "Insert into Log (feldatum, feltext) " & _
Values(" & Now() & ",'" & _
strSource & vbCrLf & _
strDesc & vbCrLF & _
strPage & vbCrLf & _
strNumber & vbCrLf & _
strLine & "')"
Set Con = Nothing
Sidan har nu visats, felet är presenterat och jag har samtidigt fått felet lagrat som en lång textsträng i min tabell och kan när jag vill gå in och se vilka poster som finns, alltså motsvarande vilka fel som uppstått. Glöm inte att lägga till ett datumfält så du också ser när felet uppstod.
Dags att aktivera sidan
Nu är det hög tid att se till att denna sida visas när vi får något fel på någon av alla våra sidor på sajten. Precis som vi konfigurerade 404-sidan via IIS så nyttjar vi samma sak fast denna gång för 500-sidan.Vå går återigen in i administrationen för IIS genom att starta Internet Tjänstehanteraren via start| Inställningar |Kontrollpanelen |Administrationsverktyg |Internet tjänstehanteraren. När du fått igång den så öppnar du trädet så du kommer till din webbserver. Högerklicka på denna och välj egenskaper.
Nu kommer du in till administrationen av din webbserver och här finner du flera flikar med olika inställningar. Fliken "Anpassade felmeddelanden" är den som vi skall använda oss av nu.
Genom att leta fram det alternativ som heter 500 - så kan du därefter dubbelklicka på det alternativet.
Genom att nu ändra sökvägen för 500 till din egna sida så är du faktiskt klar.
Mer än så behöver du faktiskt inte göra. Nu kan du exempelvis på någon av dina sidor skriva ett felaktigt syntax på något asp kommando (ex resp.write) och surfa till den sidan för att se ditt resultat.
Viktig information: Om du gör detta på en Windows 2000 Pro- webbserver som står på Internet så måste du peka ut filen via URL för att det skall fungera korrekt. Du använder en absolut sökväg och finns den exempelvis i wwwroot/include, skriv då include/500.asp
Skicka e-post med felet
Som ett komplement kan du även lägga till funktionen så man får ett mail då fel uppstår. På samma sätt använder du exempelvis IIS inbyggda objekt CDONTS (läs: Konfigurera IIS för CDONTS för att presentera ditt felmeddelande via e-post.
Dim Msg
Dim CDONTS
Msg = "Ett fel har uppstått: " & _
"Feldata: " & strSource & vbCrLf & _
"Förklaring: " & strDesc & vbCrLF & _
"Sida: " & strPage & vbCrLf & _
"Felnummer: " & strNumber & vbCrLf & _
"Fel på rad: " & strLine & "')"
Set CDONTS = CreateObject("CDONTS.NewMail")
CDONTS.From = "pelle@pellesoft.nu"
CDONTS.To = "pelle@pellesoft.nu"
CDONTS.Subject = "500-fel på hemsidan"
CDONTS.Body = msg
CDONTS.Send
Set CDONTS = Nothing
Hur du nu eventuellt bygger vidare denna sida är upp till dig. Som en förlängning på detta kan du kanske bygga en sida där man kan se alla fel som förekommer och lista dessa från dina administrationssidor.
Intelligenta sidor
Om man har väldigt stora sajter med flera hundra sidor eller kanske tusentals så kan det vara så att man behöver mer stöd för att underhålla allting. Du skulle då för varje sidvisning ställa en fråga till din tabell innan aktuella sidor visas om det föreligger några problem på sidan, komplettera med en text du kan ange där det exempelvis står: Sidan innehåller ett fel och är under reparation. Arbetet beräknas vara klart vecka 50.
Genom att använda ett fält som heter status i din feltabell kan du därmed säga att 1 = fel, ska åtgärdas, 2 = under arbete, 3 = rättad och därmed inte heller visar något fel längre. Att göra sin site dynamisk gör att besökaren slipper en massa problem, inte blir lika irriterad om man får ett tydligt meddelande att någon försöker rätta till felet osv. Det är bara din fantasi som styr vad du kan göra, så det är bara att sätta igång redan nu, lycka till.
Kristoffer Ljungqvist
Hejsan vill bara på peka att man ska ha det som url t.ex http://pellesoft.se/ där pellesoft.se är adressen till din sida som du bytar ut. På så sätt kan du få asp koden att köras på hemsidan och du får då fram koden du ser då testen som talar om vad som är fel. Om du inte kör den via url t.ex http://pellesoft.se där pellesoft.se är din adress så ser du bara koden och asp koden utförs inte.
Daniel Melin
Inget jag inte redan visste, men fortfarande bra med mycket bra tips