69pao国产精品视频-久久精品一区二区二三区-精品国产精品亚洲一本大道-99国产综合一区久久

JSP 異常處理

jsp 異常處理

當(dāng)編寫(xiě)jsp程序的時(shí)候,程序員可能會(huì)遺漏一些bug,這些bug可能會(huì)出現(xiàn)在程序的任何地方。jsp代碼中通常有以下幾類(lèi)異常:

  • 檢查型異常:檢查型異常就是一個(gè)典型的用戶(hù)錯(cuò)誤或者一個(gè)程序員無(wú)法預(yù)見(jiàn)的錯(cuò)誤。舉例來(lái)說(shuō),如果一個(gè)文件將要被打開(kāi),但是無(wú)法找到這個(gè)文件,則一個(gè)異常被拋出。這些異常不能在編譯期被簡(jiǎn)單地忽略。
  • 運(yùn)行時(shí)異常:一個(gè)運(yùn)行時(shí)異??赡芤呀?jīng)被程序員避免,這種異常在編譯期將會(huì)被忽略。
  • 錯(cuò)誤:錯(cuò)誤不是異常,但問(wèn)題是它超出了用戶(hù)或者程序員的控制范圍。錯(cuò)誤通常會(huì)在代碼中被忽略,您幾乎不能拿它怎么樣。舉例來(lái)說(shuō),棧溢出錯(cuò)誤。這些錯(cuò)誤都會(huì)在編譯期被忽略。

本節(jié)將會(huì)給出幾個(gè)簡(jiǎn)單而優(yōu)雅的方式來(lái)處理運(yùn)行時(shí)異常和錯(cuò)誤。

使用exception對(duì)象

exception對(duì)象是throwable子類(lèi)的一個(gè)實(shí)例,只在錯(cuò)誤頁(yè)面中可用。下表列出了throwable類(lèi)中一些重要的方法:

序號(hào) 方法&描述
1 public string getmessage()

返回異常的信息。這個(gè)信息在throwable構(gòu)造函數(shù)中被初始化
2 public throwablegetcause()

返回引起異常的原因,類(lèi)型為throwable對(duì)象
3 public string tostring()

返回類(lèi)名
4 public void printstacktrace()

將異常棧軌跡輸出至system.err
5 public stacktraceelement [] getstacktrace()

以棧軌跡元素?cái)?shù)組的形式返回異常棧軌跡
6 public throwablefillinstacktrace()

使用當(dāng)前棧軌跡填充throwable對(duì)象

jsp提供了可選項(xiàng)來(lái)為每個(gè)jsp頁(yè)面指定錯(cuò)誤頁(yè)面。無(wú)論何時(shí)頁(yè)面拋出了異常,jsp容器都會(huì)自動(dòng)地調(diào)用錯(cuò)誤頁(yè)面。

接下來(lái)的例子為main.jsp指定了一個(gè)錯(cuò)誤頁(yè)面。使用<%@page errorpage="xxxxx"%>指令指定一個(gè)錯(cuò)誤頁(yè)面。

<%@ page errorpage="showerror.jsp" %>

<html>
<head>
   <title>error handling example</title>
</head>
<body>
<%
   // throw an exception to invoke the error page
   int x = 1;
   if (x == 1)
   {
      throw new runtimeexception("error condition!!!");
   }
%>
</body>
</html>

現(xiàn)在,編寫(xiě)showerror.jsp文件如下:

<%@ page iserrorpage="true" %>
<html>
<head>
<title>show error page</title>
</head>
<body>
<h1>opps...</h1>
<p>sorry, an error occurred.</p>
<p>here is the exception stack trace: </p>
<pre>
<% exception.printstacktrace(response.getwriter()); %>

注意到,showerror.jsp文件使用了<%@page iserrorpage="true"%>指令,這個(gè)指令告訴jsp編譯器需要產(chǎn)生一個(gè)異常實(shí)例變量。

現(xiàn)在試著訪(fǎng)問(wèn)main.jsp頁(yè)面,它將會(huì)產(chǎn)生如下結(jié)果:

java.lang.runtimeexception: error condition!!!
......

opps...
sorry, an error occurred.

here is the exception stack trace:

在錯(cuò)誤頁(yè)面中使用jstl標(biāo)簽

可以利用jstl標(biāo)簽來(lái)編寫(xiě)錯(cuò)誤頁(yè)面showerror.jsp。這個(gè)例子中的代碼與上例代碼的邏輯幾乎一樣,但是本例的代碼有更好的結(jié)構(gòu),并且能夠提供更多信息:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page iserrorpage="true" %>
<html>
<head>
<title>show error page</title>
</head>
<body>
<h1>opps...</h1>
<table width="100%" border="1">
<tr valign="top">
<td width="40%"><b>error:</b></td>
<td>${pagecontext.exception}</td>
</tr>
<tr valign="top">
<td><b>uri:</b></td>
<td>${pagecontext.errordata.requesturi}</td>
</tr>
<tr valign="top">
<td><b>status code:</b></td>
<td>${pagecontext.errordata.statuscode}</td>
</tr>
<tr valign="top">
<td><b>stack trace:</b></td>
<td>
<c:foreach var="trace" 
         items="${pagecontext.exception.stacktrace}">
<p>${trace}</p>
</c:foreach>
</td>
</tr>
</table>
</body>
</html>

運(yùn)行結(jié)果如下:

jsp-exeception-1

使用 try…catch塊

如果您想要將異常處理放在一個(gè)頁(yè)面中,并且對(duì)不同的異常進(jìn)行不同的處理,那么您就需要使用try…catch塊了。

接下來(lái)的這個(gè)例子顯示了如何使用try…catch塊,將這些代碼放在main.jsp中:

<html>
<head>
   <title>try...catch example</title>
</head>
<body>
<%
   try{
      int i = 1;
      i = i / 0;
      out.println("the answer is " + i);
   }
   catch (exception e){
      out.println("an exception occurred: " + e.getmessage());
   }
%>
</body>
</html>

試著訪(fǎng)問(wèn)main.jsp,它將會(huì)產(chǎn)生如下結(jié)果:

an exception occurred: / by zero 
相關(guān)文章