.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