异常处理流程是一种处理程序中发生的异常的有效方法。它可以帮助程序员更好地处理异常,并且可以有效地防止程序出错。
异常处理流程通常包括三个步骤:检测、处理和恢复。首先,在程序运行过程中,要对可能出现的异常情况进行检测,如果发生了异常,就要立即停止当前的执行流程;其次,根据不同的异常情况采用不同的处理方法来解决问题;最后,将当前的执行流程恢复到正常的执行流程中去。
try { // 可能出错的代码 } catch (Exception e) { // 出错时执行的代码 } finally { // 不论是否出错都会执行的代码 }
上述代码就是一个典型的异常处理流程。try语句中包含了可能出错的代码块;catch语句中包含了出错时要执行的代码块;finally语句中包含了不论是否出错都会执行的代码块。
此外,在实施异常处理流程时也要注意一些问题。例如要尽量避免使用“catch(Exception e)”来捕获所有异常情况;要尽量避免在catch语句中使用return或throw语句来退出方法或者释放资源。
当一个 servlet 抛出一个异常时,web 容器在使用了 exception-type 元素的 web.xml 中搜索与抛出的异常类型相匹配的配置。
你必须在 web.xml 中使用 error-page 元素来指定 servlet 调用,作为对特定的异常或 HTTP 状态码作出的响应。
考虑这种情况,你有一个 ErrorHandler servelt,当任何已定义的异常或错误出现时就会被调用。以下是要在 web.xml 中创建的条目。
<!-- servlet definition --> <servlet> <servlet-name>ErrorHandler</servlet-name> <servlet-class>ErrorHandler</servlet-class> </servlet> <!-- servlet mappings --> <servlet-mapping> <servlet-name>ErrorHandler</servlet-name> <url-pattern>/ErrorHandler</url-pattern> </servlet-mapping> <!-- error-code related error pages --> <error-page> <error-code>404</error-code> <location>/ErrorHandler</location> </error-page> <error-page> <error-code>403</error-code> <location>/ErrorHandler</location> </error-page> <!-- exception-type related error pages --> <error-page> <exception-type> javax.servlet.ServletException </exception-type > <location>/ErrorHandler</location> </error-page> <error-page> <exception-type>java.io.IOException</exception-type > <location>/ErrorHandler</location> </error-page>
如果你想对所有的异常有一个通用的错误处理程序,那么你应该定义如下所示的 error-page,而不是为每个异常定义单独的 error-page 元素:
<error-page>
<exception-type>java.lang.Throwable</exception-type >
<location>/ErrorHandler</location>
</error-page>
以下是异常处理中有关上述 web.xml 需要注意的点:
Servelt ErrorHandler 与其他的 servelt 的定义方式一样,且在 web.xml 中配置。
如果状态码有任何错误出现,不管是 404(未找到)还是 403(禁止),那么 ErrorHandler servlet 会被调用。
如果 web 应用程序抛出 ServletException 或 IOException,那么 web 容器就会调用 /ErrorHandler servlet。
以下是错误处理 servlet 可以访问的请求属性列表,用来分析错误/异常的性质。
序号 | 属性 & 描述 |
---|---|
1 |
javax.servlet.error.status_code 该属性给出状态码,状态码可被存储,并在存储为 java.lang.Integer 数据类型后可被分析。 |
2 |
javax.servlet.error.exception_type 该属性给出异常类型的信息,异常类型可被存储,并在存储为 java.lang.Class 数据类型后可被分析。 |
3 |
javax.servlet.error.message 该属性给出确切错误消息的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。 |
4 |
javax.servlet.error.request_uri 该属性给出有关 URL 调用 Servlet 的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。 |
5 |
javax.servlet.error.exception 该属性给出异常产生的信息,信息可被存储,并在存储为 java.lang.Throwable 数据类型后可被分析。 |
6 |
javax.servlet.error.servlet_name 该属性给出 servlet 的名称,名称可被存储,并在存储为 java.lang.String 数据类型后可被分析。 |
以下是 Servlet 实例,用于任何你定义的 servlet 出现任何错误或异常时的情况。
这个例子让你对 Servlet 中的异常处理有了基本的了解,但是你可以使用相同的概念编写更复杂的异常处理应用程序:
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class ErrorHandler extends HttpServlet {
// Method to handle GET method request.
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// Analyze the servlet exception
Throwable throwable = (Throwable)
request.getAttribute("javax.servlet.error.exception");
Integer statusCode = (Integer)
request.getAttribute("javax.servlet.error.status_code");
String servletName = (String)
request.getAttribute("javax.servlet.error.servlet_name");
if (servletName == null){
servletName = "Unknown";
}
String requestUri = (String)
request.getAttribute("javax.servlet.error.request_uri");
if (requestUri == null){
requestUri = "Unknown";
}
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Error/Exception Information";
String docType =
"<!doctype html public "-//w3c//dtd html 4.0 " +
"transitional//en">n";
out.println(docType +
"<html>n" +
"<head><title>" + title + "</title></head>n" +
"<body bgcolor="#f0f0f0">n");
if (throwable == null && statusCode == null){
out.println("<h2>Error information is missing</h2>");
out.println("Please return to the <a href="" +
response.encodeURL("http://localhost:8080/") +
"">Home Page</a>.");
}else if (statusCode != null){
out.println("The status code : " + statusCode);
}else{
out.println("<h2>Error information</h2>");
out.println("Servlet Name : " + servletName +
"</br></br>");
out.println("Exception Type : " +
throwable.getClass( ).getName( ) +
"</br></br>");
out.println("The request URI: " + requestUri +
"<br><br>");
out.println("The exception message: " +
throwable.getMessage( ));
}
out.println("</body>");
out.println("</html>");
}
// Method to handle POST method request.
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
以常用的方式编译 ErrorHandler.java 并把你的类文件放入/webapps/ROOT/WEB-INF/classes 中。
让我们将下述配置添加到 web.xml 文件中来处理异常:
<servlet> <servlet-name>ErrorHandler</servlet-name> <servlet-class>ErrorHandler</servlet-class> </servlet> <!-- servlet mappings --> <servlet-mapping> <servlet-name>ErrorHandler</servlet-name> <url-pattern>/ErrorHandler</url-pattern> </servlet-mapping> <error-page> <error-code>404</error-code> <location>/ErrorHandler</location> </error-page> <error-page> <exception-type>java.lang.Throwable</exception-type > <location>/ErrorHandler</location> </error-page>
现在,尝试使用一个会产生任何异常的 servlet 或者输入一个错误的 URL,这将触发 Web 容器调用 ErrorHandler servlet 并显示适当的消息。例如,如果你输入了一个错误的 URL,那么它将显示如下所示的结果:
The status code : 404
上述代码在一些 web 浏览器中可能无法工作。因此请尝试使用 Mozilla 和 Safari 浏览器,这样上述代码应该能正常工作。
Swift教程 -Swift逻辑运算符逻辑运算符与布尔值和表达式一起使用返回布尔值。逻辑运算符用于测试两个表达式是否为真或一个表达式...
迭代器下面我们来探讨一下循环问题。还记得 Rust 的 for 循环吗?下面有一个例子:for x in 0..10 {println!("{}", x);}现在你已...
MATLAB中包含多样的函数集合运算,如集,交集和测试组成员等。下表显示了一些常用的设置操作:函数描述intersect(A,B)设置两个数...
MATLAB矩阵的标量操作就是加,减,乘或者除以一个数字矩阵。添加到具有原始矩阵的每个元素的行和列,相减,乘或除以数相同数量的...