220 likes | 333 Views
8 . Обработка на грешки в J2EE. Лекционен курс “ Езици и среди за програмиране в Интернет ”. доц. д-р Станимир Стоянов катедра “ Компютърни системи ”. Съдържание. 8.1. Въведение 8.2. Изключения 8.3. Обработка на изключения в сървлети. 8 .1 . Въведение. При сървърното програмиране
E N D
8. Обработка на грешки в J2EE Лекционен курс “Езици и среди за програмиране в Интернет” доц. д-р Станимир Стоянов катедра “Компютърни системи”
Съдържание 8.1. Въведение 8.2. Изключения 8.3. Обработка на изключения в сървлети
8.1. Въведение • При сървърното програмиране • Особено важно да се осигурят приложенията • Ефективна обработка на всички възникнали изключения • Съвременните Web базирани приложения работят: • 24 часа • 7 дена в седмицата • Това налага бързо идентифициране и локализиране на възникналите грешки и тяхното отстраняване
8.2. Изключения Основни типове грешки: • Compile-time: • грешки в структурата на програмата • откриваеми от компилатора • често се наричат синтактически грешки • Run-time • неоткриваеми за компилатора • наричат се още логически (семантични) грешки • откриват се посредством тестове
Изключения (execptions) – механизъм посредством който Java може да обработва грешки, които възникват по време на изпълнението на програмите • За да разберем механизма на изключенията трябва да разбираме концепцията на call stack: • В един определен момент от изпълнението на една програма call stack съдържа последователността на активираните методи • При нормално завършване обработката на един метод – той се премахва от стека, а обработката на програмата продължава в извикващия метод • Ако се активира нов метод – той се записва на въха на стека и изпълнението на програмата продължава в този метод
Ако в един момент някой метод открие ситуация, която той не може да реши – тогава е необходимо да се спре изпълнението и да се предизвика изключение • Изключението се предава на следващия метод в стека, където то може да бъде: • обработено от този метод или • предадено нататък в стека • За предпочитане – веднага обработка на изключенията.
Method A Method B Method C Method call Method call Method execution fails Exception handled Exception thrown Execution continues Method return
Method A Method B Method C Method call Method call Method execution fails Exception not handled Exception thrown Exception handled Exception thrown Execution continues
Обработка на изключения в програмния код: • Използване на exception-causing код в try catch блокове, като: • кодът, който може да предизвика изключения се записва в try-блока • кодът, който ще обработва изключенията се задава в catch- блока
try { … // код, който може да предизвика някакъв вид грешка // включително NumberFormatException … } catch (NumberFormatException e) { // код за обработване на NumberFormatException } catch (Exception e) { // код за обработване на някакъв тип грешки }
8.3. Обработка на грешки в сървлети Обработката на грешки в сървлети ще демонстрираме с примера “Loan Calculator”, където: • задаваме три параметъра: • главница • лихва • месечна вноска • искаме да разберем броя на месеците за изплащане на кредита
EE557: Server-Side Development Loan Calculator (page 1) • <html> • <head> • <title>Loan Calculator Example</title> • </head> • <body> • <CENTER><H1>Please enter the following information:</H1></CENTER> • <HR> • <FORM METHOD=“POST" ACTION="http://localhost/servlets/LoanCalculator"> • <TABLE CELLSPACING=“2” CELLPADDING=“2” BORDER=“0”> • <TR> • <TD ALIGN=“right”><B>Principal: </B></TD> • <TD ALIGN=“left”><INPUT TYPE=“text” NAME=“principal” SIZE=“10”></INPUT></TD> • </TR> • <TR> • <TD ALIGN=“right”><B>Interest: </B></TD> • <TD ALIGN=“left”><INPUT TYPE=“text” NAME=“interest” SIZE=“10”></INPUT></TD> • </TR>
EE557: Server-Side Development Loan Calculator (page 2) • <TR> • <TD ALIGN=“right”><B>Monthly Payment: </B></TD> • <TD ALIGN=“left”><INPUT TYPE=“text” NAME=“payment” SIZE=“10”></INPUT></TD> • </TR> • <TR> • <TD COLSPAN=“2” ALIGN=“center”><INPUT TYPE=“submit“ • NAME=“cmdSubmit” VALUE=“Calculate> </TD> • </TR> • </TABLE> • </FORM> • </CENTER> • </body> • </html>
Please enter the following information Principal: Interest: Monthly payment: Calculate
EE557: Server-Side Development LoanTools (page1) public static float stringToFloat(String inputString) throws NumberFormatException { Float f = new Float(inputString); return f.floatValue() ; }
EE557: Server-Side Development LoanTools (page2) public static int CalculateLoanPeriod( float principal, float interest, float payment) throws IllegalArgumetException { int months = 0; float balance = principal; while (balance > 0) { balance += ((balance * interest) / 12); balance -= payment; months += 1; if (balance > principal) { throw new IllegalargumentException(“The values entered will not “ + “evet allow the loan to be paid off”); } return months; }
EE557: Server-Side Development handleError.java private void handleError(Exception e, HttpServletResponse res) { res.setContentType("text/html"); PrintWriter out = res.getWriter(); HTML h = new HTML(“Loan Calculator: Error”); h.add(HTML.HEADING, “An error has occurred …”, false); h.add(HTML.LINE, “ ”, false); h.add(HTML.NORMAL, e.getMessage(), false); out.println(h.getPage()); out.close(); }
Кодът може да предизвика изклэчения EE557: Server-Side Development Loan Calculator.java (page1) public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // retrieve parameter values as strings String pricipalAsString = req.getparameter(“principal”); String pricipalAsString = req.getparameter(“interest”); String pricipalAsString = req.getparameter(“payment”); // variables to hold floating point values float principal, interest, payment; // variable to hold the loan repayment period int months; try { pricipal = LoanTools.stringToFloat(pricipalAsString); interest = LoanTools.stringToFloat(interestAsString); payment = LoanTools.stringToFloat(paymentAsString); months = LoanTools.calculateloanPeriod(principal, interest, payment); }
Обработка на изключения EE557: Server-Side Development LoanCalculator.java (page2) catch (NumberFormatException e) { handleError(new NumberFormatException (“Check thatthe values entered are numeric”), res); return; } catch (Exception e) { handleError( e, res); return; }
EE557: Server-Side Development LoanCalculator.java (page 3) res.setContentType("text/html"); PrintWriter out = res.getWriter(); HTML h = new HTML(“Loan Calculator Results”); h.add(HTML.HEADING, “Loan calculator results”, false); h.add(HTML.LINE, “ ”, false); h.add(HTML.NORMAL, “Principal Amount: , false); h.add(HTML.NORMAL, Float.toString(principal) , true); h.add(HTML.NORMAL, “Interest : , false); h.add(HTML.NORMAL, Float.toString(interest) , true); h.add(HTML.NORMAL, “Payment : , false); h.add(HTML.NORMAL, Float.toString(payment) , true); h.add(HTML.NORMAL, “Months until Payoff: , false); h.add(HTML.NORMAL, Integer.toString(months) , true); out.println(h.getPage()); out.close(); }
Loan Calculator results Principal amount: 2000.00 Interest: 0.09 Payment: 50.00 Months until payoff: 45
Error: 400 Check that the values entered are numeric