美文网首页Java 杂谈刻意练习:每天一张思维导图(IT类)Java
《Java编程的逻辑》笔记25--异常(下)/异常处理

《Java编程的逻辑》笔记25--异常(下)/异常处理

作者: 天一方蓝 | 来源:发表于2019-06-25 22:49 被阅读10次
    异常(下).png

    异常处理

    • catch匹配
    try{
        //可能触发异常的代码
    }catch(NumberFormatException e){
        System.out.println("not valid number");
    }catch(RuntimeException e){
        System.out.println("runtime exception "+e.getMessage());
    }catch(Exception e){
        e.printStackTrace();
    }
    

    catch可以有多条
    异常处理机制将根据抛出的异常类型找第一个匹配的catch块,找到后, 执行catch块内的代码,其他catch块就不执行了,如果没有找到,会继续到上层方法中查找。需要注意的是,抛出的异常类型是catch中声明异常的子类也算匹配,所以需要将最具体的子类放在前面,如果基类Exception放在前面,则其他更具体的catch代码将得不到执行

    • 重新throw
    try{
        //可能触发异常的代码
    }catch(NumberFormatException e){
        System.out.println("not valid number");
        throw new AppException("输入格式不正确", e);
    }catch(Exception e){
        e.printStackTrace();
        throw e;
    }
    

    为什么要重新抛出呢?
    因为当前代码不能够完全处理该异常,需要调用者进一步处理
    为什么要抛出一个新的异常呢?
    当然是当前异常不太合适,不合适可能是信息不够,需要补充一些新信息,还可能是过于细节, 不便于调用者理解和使用,如果调用者对细节感兴趣,还可以继续通过getCause()获取到原始异常。

    • finally
    try{
        //可能抛出异常
    }catch(Exception e){
        //捕获异常
    }finally{
        //不管有无异常都执行
    }
    

    catch不是必需的
    不管有无异常发生,都会执行
    (1)如果没有异常发生,在try内的代码执行结束后执行。
    (2)如果有异常发生且被catch捕获,在catch内的代码执行结束后执行
    (3)如果有异常发生但没被捕获,则在异常被抛给上层之前执行。
    一般用于释放资源,如数据库连接、文件流等

    • return
      如果在try或者catch语句内有return语句,则return语句在finally语句执行结束后才执行,但finally并不能改变返回值
      如果在finally中也有return语句呢?try和catch内的return会丢失,实际会返回finally中的返回值。 finally中有return不仅会覆盖try和catch内的返回值,还会掩盖try和catch内的异常,就像异常没有发生一样
    • throws
      用于声明一个方法可能抛出的异常
      语法
    public void test() throws AppException, SQLException, NumberFormatException {
        //....
    }
    

    对于RuntimeException(unchecked exception),是不要求使用throws进行声明的,但对于checked exception,则必须进行声明,换句话说,如果没有声明,则不能抛出

    • Checked对比Unchecked Exception

    一种普遍的说法是,RuntimeException(unchecked)表示编程的逻辑错误, 编程时应该检查以避免这些错误,比如说像空指针异常,如果真的出现了这些异常,程序退出也是正常的,程序员应该检查程序代码的bug而不是想办法处理这种异常。Checked exception表示程序本身没问题,但由于I/O、网络、数据库等其他不可预测的错误导致的异常,调用者应该进行适当处理。

    无论是checked还是unchecked异常,无论是否出现在throws声明中,我们都应该在合适的地方以适当的方式进行处理
    其实观点本身并不太重要,更重要的是项目中的一致性

    如何使用异常

    • 异常应该且仅用于异常情况
    • 异常处理的目标
      用户
      如果用户输入不对,可能提示用户具体哪里输入不对,如果是编程错误,可能提示用户系统错误、建议联系客服,如果是第三方连接问题,可能提示用户稍后重试
      程序员
      他们一般不关心用户输入错误,而关注编程错误或第三方错误,对于这些错误,需要报告尽量完整的细节,包括异常链、异常栈等,以便尽快定位和解决问题。
      第三方
      一般都是难以通过程序自动解决的,第三方错误则可能可以,甚至很多时候,程序都不应该假定第三方是可靠的,应该有容错机制。 比如说,某个第三方服务连接不上(比如发短信),可能的容错机制是,换另一个提供同样功能的第三方试试,还可能是,间隔一段时间进行重试,在多次失败之后再报告错误。
    • 异常处理的一般逻辑
      如果自己知道怎么处理异常,就进行处理,如果可以通过程序自动解决,就自动解决,如果异常可以被自己解决,就不需要再向上报告

    相关文章

      网友评论

        本文标题:《Java编程的逻辑》笔记25--异常(下)/异常处理

        本文链接:https://www.haomeiwen.com/subject/izyafctx.html