这个话题不大,但是很能体现出程序员的内功~各种框架工具那都是招式兵刃,我们一定不能把内功的修炼给忽视了,否则绝难打通任督二脉~嘎嘎~扯远了~

 

异常分为两类:checked & unchecked exception

 

先看一下几个常见的java中的unchecked excetion(RuntimeException)

ArithmeticException

ClassCastException

IndexOutOfBoundsException

IllegalArgumentException

NullPointerException

上面的几种异常类型可以引申出RuntimeException的使用场景--

RuntimeException在正常的程序执行中是不应该出现的,无论程序的运行场景是什么样的~

 

RuntimeException可以看做是一种错误,理论上上层程序是可以检测并避免的~~如果上层程序员不负责任,那么不好意思,下层程序就用抛出RuntimeException的方式来响应你~~~

 

checked exception相比RuntimeException来说,更多的是给上层传递了一些信息,比如:

UserNotFoundException

PasswordErrorException

并且强制要求上层程序一定给出在遇到checked exception的时候的处理逻辑。就是说,我们认为在遇到checked exception的时候上层程序是走到了一个相对比较少见的情形,但是这仍然是可以接受的.可以理解为一种另类的分支语句~~~

但是如果可以使用分支语句解决的,我们还是尽量采用分支来解决而不是去使用异常,估计这一点也是C#这种语言不提供checked exception这种异常的原因之一

 

对于异常处理的额外几点:

 

1、系统边界处,如在WEB中与前端交互的Controller中,在为其他系统提供的接口处,都要注意捕获所有异常,然后把异常转换为约定格式的交互数据

 

2、返回给前端的信息与log信息不应该一样,比如我们可以写一个Controller层的AOP处理逻辑来捕获所有的异常

 

public class BaseC extends Controller {

    protected static final Log log = LogFactory.getLog(BaseC.class);

    @Catch(Throwable.class)

    public static void handleThrowable(Throwable throwable) {

        log.error(ExceptionUtils.getStackTrace(throwable));

        renderJSON(new ReturnData(false, "Unknown Error~~mail to hxabc@baidu.com,3ks!", throwable.getMessage()));

    }

}

 

 

 

 

 

3、异常链问题:

异常在上层抛出的时候的处理原则:如果当前类处理不了,那就继续往上抛,如果所有的类都处理不了,比如DBException,就直接给用户一个提示就好了,但是在这个异常链处理过程中,异常不应该丢失,记log,继续throw

 

4、类库或者模块应该定义自己的异常基类,比如jdbc那套接口,有一个公共的异常基类:SQLException,然后再根据具体的情况抛出定制化的异常,提供尽量详细的信息,比如:

SQLTimeoutException

SQLFeatureNotSupportedException

SQLInvalidAuthorizationSpecException

 

5、Thinking in java的作者说:大多数时候,异常类其实只需要一个良好定义的类名~~我们在设计异常类的命名时一定要做到准确清晰~~

 

本文首发于【百度运维空间

http://hi.baidu.com/ops_bd/blog/item/93b4d93f0a2f0eedb311c718.html

关注百度技术沙龙