美文网首页
Java-L02: Exception 与 Error 的差异

Java-L02: Exception 与 Error 的差异

作者: WenxuanLi | 来源:发表于2019-04-09 05:34 被阅读0次

    李文轩 2019-03-08
    声明:这是本人学习极客时间的Java核心36讲的笔记,有侵权请联系我。


    Throwable类:

    • Exception 和 Error 都继承了 Throwable 类
    • Java 中只有 Throwable类的实例才可以被抛出(throw)或者捕获(catch)

    Exception:

    • 程序正常运行中,可预见的意外情况
    • 应该被捕获并处理

    checked vs. unchecked

    • checked 必须在源代码中显式得捕获处理,编译期检查的部分
    • unchecked 是 运行时异常,大多为编码的逻辑错误,按情况决定捕获

    Error:

    • 正常情况下,不太出现的情况
    • 多数出现在,JVM自身处于不正常状态,不可回复的状态
    • 不需要捕获

    具体 throwable class

    Java_Throwable

    实践:

    1. 尽量不要捕获类似 Exception的通用异常,而是应该捕获特定异常
      • 被抛出的异常该体现出尽量多的信息,通常异常往往隐藏了部分信息
    2. 不要生吞(swallow)异常
      • 即假设代码可能不会发生(极其危险),检查到这个异常时不给任何措施
      • 这样的处理会导致,如果真的运行到这段代码,没有人会知道发生了什么
    3. 产品中用 printStackTrace() 的选择错误
      • printStackTrace() 仅仅是输出到 standard error steam (STERR),对于产品来说,往往输出到产品日志会是更好的选择;因为复杂的系统,我们很难判断 printStackTrace() 会输出到哪

    Throw early, catch late

    • 不要用一个 variable 的时候才抛出异常,应该在有权利查看时,就检查。
    • 保留原有异常的 cause 信息,直接抛出或者建立新异常抛出

    自定义异常:

    • 目的:保证提供足够信息
    • 考虑:
      1. 是否定义为 checked Exception; 这种类型设计就是为了从异常情况中恢复
      2. 避免敏感信息,以及可能导致的潜在的安全问题

    性能角度审视Java的异常处理机制(try-catch):

    • 产生额外的性能开销
      • 建议只把try 用在必要的代码段
      • try 比 if 和 switch 要低效
    • exception 的实例化,都会对栈进行快照
      • 栈的快照开销巨大

    相关文章

      网友评论

          本文标题:Java-L02: Exception 与 Error 的差异

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