异常处理(一):java中的那套异常,和.net大同小异

.net常见异常类

System.Object

System.Exception

System.SystemException

ApplicationException

1、SystemException类:该类是System命名空间中所有其他异常类的基类。(建议:公共语言运行时引发的异常通常用此类)

2、ApplicationException类:该类表示应用程序发生非致命错误时所引发的异常(建议:应用程序自身引发的异常通常用此类)

java异常类层次图:

java.lang.Object

java.lang.Throwable

java.lang.Exception

java.lang.RuntimeException

java.lang.CheckedException

java.lang.Error

Throwable类是 Java语言中所有错误或异常的超类

Error:表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。

Exception:可捕捉到的,进而对其进行处理的异常。

Java提供了两类主要的异常:runtime exception和checkedexception。checked异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写catch块去处理可能的异常。

但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。

为什么要捕获异常

把程序从异常中恢复出来,比如避免服务终止,事务回滚等。

出现异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。

如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。

捕获异常,打印错误信息,记录程序运行日志信息。

抛出特定异常或者捕获异常,可以显示给用户指定错误页面。

声明式

简单,不灵活

根据特定异常类别,跳到指定错误页

xml配置

<error-page>

<exception-type>com.java.drp.util.ApplicationException</exception-type>

<location>/error.jsp</location>

</error-page>

如果没有手动捕获,遇到异常时就会跳到错误页。错误页加入isErrorPage="true",才可以使用jsp隐含对象exception

error.jsp

<%@page contentType="text/html;charset=GB18030"%>

<%@ page isErrorPage="true"%>

<html>

<head>

<title>错误信息!</title>

</head>

<body>

<center>

<tablewidth="500">

<tr>

<tdalign="center">

<palign="left">

<spanclass="STYLE1">错误信息:</span>

</td>

</tr>

</table>

<hr>

<tablewidth="500">

<tr>

<td>

<%=exception.getMessage()%></td>

</tr>

<tr>

<tdalign="center" colspan="2">

<p>

<inputtype="button" name="goback" value="返回"

onClick=javascript:history.go(-1);>

</td>

</tr>

</table>

</center>

</body>

</html>

根据异常错误码(404、500等),跳到指定错误页

xml配置

<error-page>

<error-code>404</error-code>

<location>/http_error.jsp</location>

</error-page>

<error-page>

<error-code>500</error-code>

<location>/http_error.jsp</location>

</error-page>

ie有bug,使用跳转

http_error.jsp

<%@page language="java" import="java.util.*"pageEncoding="GB18030"%>

<html>

<head>

<title>My JSP ‘http_error.jsp’starting page</title>

</head>

<body>

<%

Integer errorCode =(Integer)request.getAttribute("javax.servlet.error.status_code");

if(errorCode == 404){

response.sendRedirect(request.getContextPath()+ "/404.jsp");

} else if (errorCode ==500){

response.sendRedirect(request.getContextPath()+ "/500.jsp");

}

%>

</body>

</html>

编程式

几种处理方式

    根据每种业务语义创建不同的异常,如:UserNotFoundException每层抛出相应的异常,如:DaoException,ServiceException

      Dao层异常最好不要直接抛给用户,最好由业务层转换成用户理解的异常再抛出。如果dao向上抛SQLException或者FileException,Manager就知道了具体信息,所以不管发生啥,只抛DaoException;同样,Manager只抛ServiceException给Servlet
    每个模块抛出一种异常,如:SysMgrException只抛出一种异常,如:AppException错误码可以做到异常细粒度划分,采用错误码可以减少异常类的建立,参见:java.sql.SQLException

各个语言有各自的一套异常处理机制,基础上大同小异。自己要先看得起自己,别人才会看得起你

异常处理(一):java中的那套异常,和.net大同小异

相关文章:

你感兴趣的文章:

标签云: