Ošetření chyb v ASP za běhu aplikace

20. června 2000

Jistě se vám již povedla napsat stránka, která vám během testování fungovala zcela bez problémů. Po zpřístupnění stránky najednou zjišťujete, že spoustě uživatelů z nejrůznějších důvodů nechodí. Většinou se o těchto problémech dozvíte až po stížnostech na nefunkčnost stránky. Příčinou bývá většinou nesprávné zadání dat uživatelem. V dnešním článku si ukážeme, jak podobným případům předcházet, či spíše, jak se o chybě dozvědět bez přičinění uživatele.

Občas se stává, že se na provedené ASP stránce se objeví chybové hlášení:

Microsoft VBScript runtime error ‚800a01a8‘
Object required: ‚oconn‘
/KBIntranet/system/test.asp, line 6

Toto hlášení dost často zničí celý design stránky či ji nezobrazí vůbec. Naštěstí v ASP máme možnost potlačit vypisování chybových hlášení pomocí On Error Resume Next.

Možnosti ošetření chyb
Možností jak ošetřit chyby v naší webové aplikaci je několik a můžeme je v podstatě zařadit do tří úrovní:

  1. potlačit vypisovaní chybových hlášení
  2. regulované vypisování chybových hlášení
  3. aktivní upozorňování administrátora

První možnost je zcela jednoduchá a primitivní. Na počátku ASP kódu uvedeme kód On Error Resume Next a v případě výskytu chyby běží ASP jako by se nic nestalo – tedy až no to, že došlo k chybě, která často pak následně vyvolá řetěz dalších chyb. Protože nejsou vypisována žádná chybová hlášení, je to jako kdyby žádná chyba nebyla a to je stav mnohem horší, než kdyby se zobrazila chybová hláška.

Druhá možnost je naznačená v následujícím kódu a umožňuje nám definovat hlášení při výskytu chyby.

On Error Resume Next
Err.Clear
kód, který se má vykonat a může způsobit chybu
If (Err.number <> 0) Then
   ‚zde se umístí kód, který se má vykonat při chybě
   Response.Write „Error : “ & CStr(Err.Number)
   Response.Write „<br>Description : “ & Err.Description
   Err.Clear
End If

Příkazem Err.Clear „vyčistíme“ objekt Error. Pokud nám stránka proběhne bez chyby je Err.Number = 0. V opačném případě můžeme pomocí metod Number a Description vypsat danou chybu nebo vykonat nějakou další akci podle potřeby.

Druhý způsob ošetřování chyb na stránce nám už poskytuje celkem pěkné možnosti, jak upravit standardní chybová hlášení, ale neřeší nejpodstatnější věc a tou je informování administrátora webové aplikace, že nastala chyba. Možností máme několik, navrhuji tři:

  1. ukládání chybových hlášení do textových souborů
  2. poslání emailu administrátorovi
  3. ukládání chybových hlášení do databáze

V dnešním článku uvedu řešení prvního a druhého způsobu a řešení třetího si ponechám do dalšího pokračování.

První způsob může vypadat následovně (předpokládejme, že tento soubor se jmenuje „test.asp“):

On Error Resume Next
Err.Clear
kód, který se má vykonat a může způsobit chybu
If (Err.number <> 0) Then
   Dim ObjFs,ObjSTream
   Set ObjFS=Server.CreateObject(„Scriptng.FileSystemObject“)
   Set ObjStrem=ObjFS.Open(„C:\error.log“,ForAppend,True)
   ObjStream.writeLine(„Datum a čas“ &now())
   ObjStream.writeLine(„Chyba “ & CStr(Err.Number) & “ v souboru test.asp“ & VbCrLf & „Popis chyby : “ & CStr(Err.Description)
   ObjStream.close
   Set ObjStream=Nothing
   Set ObjFS=Nothing
   Err.Clear
End If

V příkladu je využita práce s textovými soubory, která byla popsána v článku Práce se soubory pomocí ASP II. a proto ji zde nebudu dále rozvádět.

Druhý způsob může vypadat následovně (předpokládejme, že tento soubor se jmenuje „test.asp“):

On Error Resume Next
Err.Clear
kód, který se má vykonat a může způsobit chybu
If (Err.number <> 0) Then
   Dim myMail
   Set myMail = CreateObject(„CDONTS.NewMail“)
   myMail.From = „error@interval.cz“
   myMail.To = „webmaster@interval.cz“
   myMail.Subject = „Chyba “ & CStr(Err.Number) & “ v souboru test.asp“
   myMail.Body = „Chyba “ & CStr(Err.Number) & “ v souboru test.asp“ & VbCrLf & „Popis chyby : “ & CStr(Err.Description)
   myMail.Send
   Set myMail = Nothing
   Err.Clear
End If

V druhém způsobu řešení je použit objekt CDONTS.NewMail, který se používá k posílání libovolných e-mailových zásilek pomocí ASP. Tento objekt nebyl doposud na Intervalu popsán, ale mohu vám slíbit, že článek na toto téma vyjde v dohledné době.

Na závěr si vám dovolím předložit tento příklad:

on error resume next
dim chyba
set chyba=server.CreateObject(„bla bla bla“)
if err.number<>0 then
   Response.Write(„Chyba číslo: „&err.number)
   Response.Write(„<br>“)
   Response.Write(„Popis Chyby: „&err.Description)
   Response.Write(„<br>“)
   Response.Write(„Zdroj chyby: „&err.source)
   Response.Write(„<br>“)
   err.clear
end if
Response.Write(„<br>“)
datum=cdate(„blbost“)
if err.number<>0 then
   Response.Write(„Chyba číslo: „&err.number)
   Response.Write(„<br>“)
   Response.Write(„Popis Chyby: „&err.Description)
   Response.Write(„<br>“)
   Response.Write(„Zdroj chyby: „&err.source)
   Response.Write(„<br>“)
   err.clear
end if
Response.Write(„<br>“)
vysledek=10/0
if err.number<>0 then
   Response.Write(„Chyba číslo: „&err.number)
   Response.Write(„<br>“)
   Response.Write(„Popis Chyby: „&err.Description)
   Response.Write(„<br>“)
   Response.Write(„Zdroj chyby: „&err.source)
   Response.Write(„<br>“)
   err.clear
end if

Pozorný čtenář si jistě zeptá, proč je zde uveden kód, který obsahuje několik chyb a navíc nemá téměř žádný smysl. Na tomto kódu jsem vám chtěl názorně ukázat, jak se projeví ošetření chybových stavů. Výsledek příkladu je pod čarou.


<% on error resume next dim chyba set chyba=server.CreateObject("bla bla bla") if err.number<>0 then Response.Write(„Chyba číslo: „&err.number) Response.Write(„
„) Response.Write(„Popis Chyby: „&err.Description) Response.Write(„
„) Response.Write(„Zdroj chyby: „&err.source) Response.Write(„
„) err.clear end if Response.Write(„
„) datum=cdate(„blbost“) if err.number<>0 then Response.Write(„Chyba číslo: „&err.number) Response.Write(„
„) Response.Write(„Popis Chyby: „&err.Description) Response.Write(„
„) Response.Write(„Zdroj chyby: „&err.source) Response.Write(„
„) err.clear end if Response.Write(„
„) vysledek=10/0 if err.number<>0 then Response.Write(„Chyba číslo: „&err.number) Response.Write(„
„) Response.Write(„Popis Chyby: „&err.Description) Response.Write(„
„) Response.Write(„Zdroj chyby: „&err.source) Response.Write(„
„) err.clear end if %>


A co nás čeká příště? – Naučíme se využít Response.Buffer a Response.Clear při ošetřování chybových stavů. Naučíte se ošetřovat chyby ve skriptech na straně klienta. Dozvíte se, jak zapisovat chybové stavy do databáze a také vám představím novinku v IIS 5.0. – Centrální ošetření chyb. Takže máte se na co těšit.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *