这个话题不大,但是很能体现出程序员的内功~各种框架工具那都是招式兵刃,我们一定不能把内功的修炼给忽视了,否则绝难打通任督二脉~嘎嘎~扯远了~
异常分为两类: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 [email protected],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
【关注百度技术沙龙】