java基础之一异常

来源:互联网 发布:tensorflow文档 编辑:程序博客网 时间:2024/05/29 08:30

异常分类

Error:与虚拟机相关,例如系统崩溃,虚拟机错误,动态链失效等,无法捕获

举例:AWTError,IOError,LinkageError,ThreadDeath等

Exception:分为RuntimeException及其子类和非运行异常(SQLException,IOException)

举例:NullException(调用对象实例方法或者变量时),classNotFundException,ArrayIndexOutOfBoundException,NumberFormatException等都为运行时异常。

异常体系

分为checked异常(可处理,编译器会识别)和Runtime异常包含子类
针对前者只能程序员开发规范尽量保证代码健壮性

运行时异常处理原则

如下:

1. 异常转译(catch抛出新异常)能够明确会抛出什么异常,尽量在catch块中进行部分处理,并抛出一个新的业务异常,让调用者处理该异常,主要用于上一层调用者接受友好提示。
应用于后台日志记录异常发生,并给调用者友好提示

2.catch关键字:先捕获小异常,后大异常
3.异常链:设计模式—–责任链模式
先捕获一个异常,部分处理,然后抛出给调用者,一层一层向上抛出,主要用于封装保存底层异常信息

回收资源:finally关键字

主要用于数据库连接,网络连接,流连接等物理资源回收
注意点:

  1. try必须至少带一个catch或者finally块;
  2. try/catch块中有return或者异常抛出,finally中都要被执行,除非java虚拟机异常,退出java虚拟机等,例如:Sytem.exist(0);Error错误
  3. finally中尽量避免使用return方法返回,因为当try/catch块中含有处理异常的信息,系统会先去执行finally中的代码,如果有return,方法直接返回,try/catch中的代码将不会被执行。

java7后异常使用

  1. 使用catch(A|B|C)捕获多种异常,但是不能对其中异常变量进行重新赋值,因为异常变量已经隐士被final修饰,捕获单个异常可以对变量值进行重新赋值;
  2. try块中自动关闭回收物理资源,实质是隐式的finally代码块。使用如下:
try(BuffderedReader br=new BufferedReader(new FileReader("a.txt"));....)//括号内这个输出流是安全的,系统会自动关闭这个流资源{........//业务代码}

当然也可以在此基础上增加多个catch和一个finally代码块。

这里补充下最近学习

springmvc处理异常

思路:
因为springmvc是使用异常处理器来处理从dao层或者service层抛出的异常被controller调用来处理,所以实际工作中,dao层和service层方法基本是简单捕获处理并且要和谐抛出自定义异常。

具体配置疑问见:http://blog.csdn.net/eson_15/article/details/51731567

  1. 第一:使用springmvc自带的异常处理器SimpleMappingExceptionResolver,并定义一个CustomException继承Exception
    自定义异常:
Public class CustomException extends Exception{    private String message;    public CustomException(){}    public CustomException(String message){        super(message);        this.message=message;    }    //message 的get/set方法}

springmvc.xml配置

<!-- springmvc提供的简单异常处理器 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">     <!-- 定义默认的异常处理页面 -->    <property name="defaultErrorView" value="/WEB-INF/jsp/error.jsp"/>    <!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception -->     <property name="exceptionAttribute" value="ex"/>    <!-- 定义需要特殊处理的异常,这是重要点 -->     <property name="exceptionMappings">        <props>            <prop key="ssm.exception.CustomException">/WEB-INF/jsp/custom_error.jsp</prop>        </props>        <!-- 还可以定义其他的自定义异常 -->    </property></bean>
  1. 常使用 第二:自定义全局统一异常处理器,如果发现时自定义异常,则提示自定义异常,否则提示“系统未知错误”
    自定义异常处理器:
public class CustomExceptionResolver implements HandlerExceptionResolver {    @Override    public ModelAndView resolveException(HttpServletRequest request,            HttpServletResponse response, Object handler, Exception ex) {        ex.printStackTrace();        CustomException customException = null;        //如果抛出的是系统自定义的异常则直接转换        if(ex instanceof CustomException) {            customException = (CustomException) ex;        } else {            //如果抛出的不是系统自定义的异常则重新构造一个未知错误异常            //这里我就也有CustomException省事了,实际中应该要再定义一个新的异常            customException = new CustomException("系统未知错误");        }        //向前台返回错误信息        ModelAndView modelAndView = new ModelAndView();        modelAndView.addObject("message", customException.getMessage());        modelAndView.setViewName("/WEB-INF/jsp/error.jsp");        return modelAndView;    }}

springmvc.xm文件配置:

<!-- 自定义的全局异常处理器 只要实现HandlerExceptionResolver接口就是全局异常处理器--><bean class="ssm.exception.CustomExceptionResolver"></bean> 

这样可以在dao抛出异常到service然后直接被contrller处理器来拦截处理
3. 第三使用@ExceptionHandler注解(不推荐,需要继承多个类,详见链接(http://blog.csdn.net/eson_15/article/details/51731567))

原创粉丝点击