<-- home

java异常控制哲学

想要解决以下问题:

  • 什么时候需要异常控制,使用的类库需要抛出异常的时候
  • 到底是应该捕获异常还是应该抛出异常
  • 这其中对异常的控制有着什么样的哲学么

我在写爬虫程序的时候就遇见了这样的问题,当iP被封锁之后程序异常之后main方法就停掉了,我想要的效果是去获取页面的方法一直请求(可以更换ip),直到拿到这个页面为止。


以在main方法中运行的程序为例子,什么情况下main方法直接停了下来,什么时候有异常了还能继续执行下去?

其实很简单:

直接暴露个jvm的异常就会导致直接停掉,这里的停掉是指停掉这个线程,具体的就是web应用中的一个controller的方法异常了之后这个用户的线程就终止了,从而页面可能就访问不到了。而异常被捕获之后就不会抛给jvm这个时候是不会停下来的,只会报个异常,异常处理跟抛出的区别就是自己处理可以做点其他的事情。

我用关键字【jvm 异常】谷歌了一下,知道了,异常分为运行时异常和编译时异常,编译时异常是上面说的那些异常,运行时异常是运行的时候产生的,也就是是由程序员制造出来的。编译时异常需要用try-catch-finally来处理。

总结


1.异常分为编译时异常和运行时异常,编译时异常eclipse可以检查出来,让你捕获或者抛出。运行时异常eclipse检测不出来,只有运行的时候直接抛给jvm.

2.异常如果被抛出,jvm就会将这个线程停掉。

3.向上抛出不抛出是一个很难有定论的问题,这跟业务有关系,是你的异常就自己捕获处理,不是你的就跑出,比如我写了个接口就需要向上一层抛出异常,让他们知道。


参考连接:

wenxueliu/draft Java异常处理机制与最佳实践