JavaServer Pages – spracovanie výnimiek

11. dubna 2003

Každý človek je omylný a robí chyby. Ako vývojári intranetových aplikácií, tak aj ich užívatelia. Preto nám jazyk Java, respektíve technológia JSP, dáva k dispozícii určité nástroje a mechanizmy na obsluhu vzniknutých chýb. V tomto článku si ukážeme dva základné spôsoby ako môže programátor zvládnuť chyby.

Pri tvorbe intranetovej aplikácie môžu teoreticky vzniknúť pri požiadavke na stránku dva typy chýb. Prvý typ chyby je Translation Time Processing Error a vzniká pri kompilovaní stránky. Druhý typ, označovaný ako Request Time Processing Error, vznikne, ako vyplýva z názvu, pri požiadavke na stránku. Aký je rozdiel medzi týmito chybami?

Keď vytvárate stránku JSP, používate rôzne elementy. Direktívy, deklarácie, skriptlety, html tagy a podobne. Všetky tieto elementy majú predpísanú syntax, ktorú treba dodržiavať. To isté platí pre jazyk Java. Ak je napríklad dané, že telo deklarovanej metódy musí začínať otváracou zloženou zátvorkou a končiť uzatváracou zloženou zátvorkou, nemôžete niektorú z nich vynechať. Nie, nebojte sa, nebudem sa tu teraz venovať výkladu syntaxe Javy.

Ide o to, že ak tú zátvorku vynecháte, vznikne chyba pri kompilovaní stránky, ktorú vyhodí kompilátor. Server následne pošle klientovy stránku s kódom chyby 500 – Server Error s popisom vzniknutej chyby (ktorý vám málokedy pomôže). A toto je práve prvý typ chyby – Translation Time Processing Error. Proti týmto chybám sa dá bojovať dvoma spôsobmi. Dôkladnou kontrolou napísaného kódu a debugovaním stránky. Aj keď sa snažíte po sebe napísaný kód kontrolovať, nejaká chybička vám môže ujsť. Preto je treba stránky testovať. Na debugovanie stránky zase potrebujete dajaký nástroj (napríklad Sun One Studio 4 CE). Takže ak vašimi nástrojmi sú len Notepad a Tomcat, je veľmi ťažké bojovať s takýmto typom chýb.

S prvým typom chyby sa nesmie užívateľ aplikácie vôbec stretnúť. Na to sú testery aby sa takéto chyby odhalili už vo fáze vývoja aplikácie. S druhým typom chyby sa môže užívateľ stretnúť, alebo ju sám vytvoriť, napríklad pri nesprávnom zadaní vstupných údajov vo formulári. Takýmto chybám vravíme výnimky.

Počas spracovania požiadaviek môže vzniknúť výnimka priamo na stránke alebo v inom kóde, ktorý je volaný zo zdrojovej stránky. Na obsluhu a zachytávanie týchto výnimiek sa môže použiť štandardný Java exception mechanizmus, alebo systém takzvaných chybových stránok. Prvý spôsob predpokladá zachytávanie výnimiek priamo na stránke JSP. Pri druhom spôsobe každá neodchytená výnimka spôsobí, že užívateľ bude presmerovaný spolu so vzniknutou výnimkou na špeciálnu chybovú stránku. Vysvetlím to na príklade o niečo nižšie.

Základné ošetrenie výnimiek v JSP

Veľké množstvo chýb je možné ošetriť už na vstupe od užívateľa. Mám na mysli rôzne formuláre, cez ktoré užívateľ zadáva alebo vyberá údaje. Verifikáciu týchto vstupov je možné spraviť na strane klienta pomocou JavaScriptu. Kto nemôže alebo nechce použiť JavaScript, môže zabezpečiť kontrolu na strane servera v jazyku Java. Ukážme si jednoduchý príklad, ktorý skontroluje, či do poľa bolo zadané celéčíslo pomocou číslic. Využijem pritom mechanizmus výnimiek. Nasleduje úvodná stránka (number.jsp):

<body>
<%
if (request.getParameter(„error“) != null) {
 String error = request.getParameter(„error“);
 out.print(„Nezadali ste číslo!<br>“);
 out.print(„<font color=\“#FF0000\“>Chyba: “ +error+ „</font>“);
}
%>
<form action=“check_number.jsp“ method=“post“>
 Zadaj celé číslo: <input type=“text“ name=“cislo“ maxlength=“10″>
 <input type=“submit“ name=“ok“ value=“ok“>
</form>
<em>Môžete použiť akýkoľvek spôsob vyjadrenia čísel :-)</em>
<em>Napríklad: Osem -> 8 -> VIII</em>
</body>

Máme jednoduchý formulár na zadanie čísla. Keďže som chcel príklad maximálne zjednodušiť, na volanej stránke check_number.jsp robím prevod zadaného znaku iba na integer. V prípade, že zadáte iné ako celé číslo, vráti vám to chybu. Čo samozrejme nie je správne. Celé čísla sú od – 2 147 438 648 do + 2 147 438 648. Nad samotným formulárom testujem, či stránka bola volaná s parametrom error. Ak áno, vypíšem obsah chyby červenou farbou (check_number.jsp):

<body>
<% String cislo = request.getParameter(„cislo“);
 try {
  int i = Integer.valueOf(cislo).intValue();
  out.print(„Zadali ste: “ +i);
  out.print(„<br><a href=\“number.jsp\“>Back</a>“);
 }
 catch(NumberFormatException e) { %>
  <jsp:forward page=“number.jsp“>
   <jsp:param name=“error“ value=“<%= e.toString()%>“/>
  </jsp:forward>
<%
 }
%>
</body>

Na stránke check_number.jsp najprv prečítam parameter cislo a vložím ho do premennej cislo. Treba si uvedomiť, že metóda getParameter(String s) vždy vráti objekt typu String. To znamená, že ak následne potrebujem číslo, musím daný reťazec pretypovať. A práve pri tejto operácii pretypovania môže vzniknúť výnimka NumberFormatException. No a túto skutočnosť môžem využiť. Preto použijem takzvaný. try-catch blok. Do časti try{} vložím všetok kód, ktorý môže spôsobiť výnimku. V časti catch{} túto výnimku spracujem a presmerujem užívateľa znova na stránku number.jsp. Tentoraz však už aj s chybou.

Okrem try-catch bloku existuje ešte try-catch-finally blok. Rozdiel je v tom, že v časti finally{} sa uvádza kód, ktorý má byť za každých okolností vykonaný aj v prípade vzniku výnimky. Sem sa napríklad umiestňujú príkazy na uzatváranie databázových spojení, otvorených súborov a podobne. Ešte pripomeniem, že catch{} blokov môžem mať viacej, každý pre konkrétnu výnimku. Teda niečo takéto:

try {
 … kód ktorý treba ustrážiť …
}
catch(SomeException1 se1) {
 … ošetrenie výnimky
}
catch(SomeException2 se2) {
 … ošetrenie výnimky se2
}

finally {
 … nutný kód …
}

Tým sme prešli prvý spôsob, ako si poradiť s výnimkami. Základ je výnimku zachytiť (Java je v tomto pomerne striktná) a vrátiť užívateľovi zoznam vzniknutých chýb. Samozrejme v zrozumiteľnej forme. Uvedený príklad je pomerne jednoduchý. Ale pri reálnych aplikáciách je nutné kontrolovať oveľa väčšie množstvo parametrov. V takom prípade sa oplatí použiť na kontrolu formulára JavaScript.

Nie vždy dopredu viem aká výnimka môže vzniknúť. Mám preto aj inú možnosť ako spracovať výnimky. Používa sa na to direktíva page, ktorá sa väčšinou umiestňuje do hlavičky stránky:

//vložím na stránku kde môže vzniknúť výnimka
<%@ page errorPage=“error.jsp“ %>
//vložím na stránku kde budem výnimku spracovávať
<%@ page isErrorPage=“true“ %>

Celé to funguje pomerne jednoducho. Ak na stránke vznikne neošetrená výnimka, užívateľ je automaticky presmerovaný na stránku uvedenú v direktíve page v atribúte errorPage. Na tejto stránke je potom k dispozícii objekt exception triedy príslušnej výnimky, ktorá vznikla na predchádzajúcej stránke. Stránka, na ktorej spracovávame vzniknutú výnimku, musí mať v hlavičke direktívu page s atribútom isErrorPage="true".

Pozrite si nasledujúci príklad(number_redirect.jsp):

<body>
<form action=“check_number_redirect.jsp“ method=“post“>
 Zadaj celé číslo: <input type=“text“ name=“cislo“ maxlength=“10″>
 <input type=“submit“ name=“ok“ value=“ok“>
</form>
<em>Môžete použiť akýkoľvek spôsob vyjadrenia čísel :-)</em>
<em>Napríklad: Osem -> 8 -> VIII</em>
</body>

Stránka je totožná s predchádzajúcou number.jsp, len s tým rozdielom, že nekontrolujem, či stránka bola volaná s nejakým parametrom. Po zadaní vstupu a potvrdení je volaná stránka check_number_redirect.jsp:

<%@ page contentType=“text/html“ errorPage=“error.jsp“%>
<body>
<%
 String cislo = request.getParameter(„cislo“);
 int i = Integer.valueOf(cislo).intValue();
 out.print(„Zadali ste: “ +i);
 out.print(„<br><a href=\“number_redirect.jsp\“>Back</a>“);
%>
</body>

Na volanej stránke opäť spravím konverziu string na integer. Ak vznikne výnimka užívateľ je automaticky presmerovaný na error.jsp, kde už len vypíšem vzniknutú chybu:

<%@ page contentType=“text/html“ isErrorPage=“true“ %>
<body>
<%
out.print(„Nezadali ste číslo!<br>“);
out.print(„<font color=\“#FF0000\“>Chyba: “ +exception+ „</font><br>“);
out.print(„<br><a href=\“number_redirect.jsp\“>Back</a>“);
%>
</body>

Ukázali sme si dva základné spôsoby, ako si poradiť s výnimkami, s ktorými sa ako programátor určite stretnete. Uvedené spôsoby sú samozrejme určené len na spracovanie výnimiek. Programátorské chyby, chyby syntaxe, logické chyby a podobne musí „odchytiť“ každý sám. Na záver ponúkam príklady na stiahnutie.

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 *