《码出高效:Java开发手册》学习笔记5

一、异常分类
java中的异常分类结构如下图:
在这里插入图片描述
说明:

  • Error:一般是发生在JDK层面的一写系统层面的异常。比如StackOverflowError、OutOfMemoryError。此类错误结合虚拟机去理解更加容易。
  • 在Exception中分为受检(checked)和非受检(unchecked)异常。 checked异常一般在IDE工具中在没有写明throws或try-catch捕捉时会出现红色下划线提示的错误。而非受检异常一般继承自RuntimeException运行时异常。 而对于unchecked异常,可进一步划分为如下三类:
          - 可预测异常IndexOutOfBoundsException、NullPointerException等,基于对代码的性能和稳定性要求,此类异常不应该被产生或者抛出,而应该提前做好边界检查、空指针判断等处理。
           - 需捕捉异常
          - 可透出异常:**要是指框架或系统产生的且会自行处理的异常,而程序无须关心。**例如针对spring框架中抛出的NoSuchRequestHa ndlingMethodException异常,spring框架会自己完成异常的处理,默认将自身抛出的异常自动映射到合适的状态码,比如启动防护机制跳转到404页面。
    二、try代码块
    当存在try-finally代码块时,finally代码块没有执行的三种可能:
  • 没有进入代码块。
  • 进入代码块,但是代码运行中出现了死循环或死锁状态。
  • 进入代码块,但是执行了System.exit() 操作。
    **PS:finally是在return表达式运行后执行的,此时将要return的结果已经被暂存起来,待finally代码块执行结束后再将之前暂存的结果返回。**如下方法的最终返回值是10001
    在这里插入图片描述
    三、日志
    1、日志规范:
    日志命名格式:appName_logType_logName.logo其中,logType为日志类型,推荐分类有stats、monitor、visit等;logName为日志描述。
    日志保存周期:本书中推荐日志文件至少保存15天,可以根据日志文件的重要程度、文件大小及磁盘空间再自行延长保存时间。
    日志级别:
    DEBUG级别日志:记录对调试程序有帮助的信息。
    INFO级别日志:用来记录程序运行现场,虽然此处并未发生错误,但是对排查其他错误具有指导意义。
    WARN级别日志:也可以用来记录程序运行现场,但是更偏向于表明此处有出现潜在错误的可能。
    ERROR级别日志:表明当前程序运行发生了错误,需要被关注。但是当前发生的错误,没有影响系统的继续运行。
    FATAL级别日志:表明当前程序运行出现了严重的错误事件,并且将会导致应用程序中断。
    在打印日志时,针对不同日志级别的处理方式:
  • 预先判断日志级别。对DEBUG、INFO级别的日志,必须使用条件输出或者使用占位符的方式打印。该约定综合考虑了程序的运行效率和日志打印需求。在开发手册中中说明的是当系统日志级别为WARN时,如果针对DEBUG级别的日志,仅仅在程序中写出logger.debug(),日志不会被打印,why?
  • 避免无效曰志打印:生产环境禁止输出DEBUG日志,且有选择的输出INFO日志。在输出DEBUG和INFO级别的日志时,一定要注意磁盘的日志输出量。
  • 区别对待错误日志:WARN、ERROR都是与错误有关的日志级别,但不要一发生错误就笼统地输出 ERROR级别日志。ERROR级别只记录系统逻辑错误、异常或者违反重要的业务规则,其他错误都可以归为WARN 级别。
  • 保证记录内容完整:
    (1)记录异常时一定要输出异常堆栈,例如logger.error(“xxx”+e.getMessage(), e) (2)日志中如果输出对象实例,要确保实例类重写了toString方法,否则只会输出对象的hashCode值,没有实际意义。

2、日志框架

日志框架分为三大部分:日志门面,日志适配器,日志库。
在这里插入图片描述
日志门面:日志框架采用门面设计模式,类似于JDBC设计理念。**它只提供一套接口规范,自身不负责日志功能的实现。**目前主要试用的日志门面有两种:commons-logging,slf4j(推荐)。
日志库:它具体实现了日志的相关功能, 目前主流的日志库有三个,分别是log4j、log-jdk、logback。log4j为最早诞生的日志库。logback最晚出现,是log4j的升级版本且实现了slf4j的接口。
日志适配器: 日志适配器分两种场景:
(1) 日志门面适配器,因为slf4j的规范是后来提出的,在此之前的日志库是没有实现slf4j的接口的,例如log4j;所以,在工程里要想使用slf4j+log4j的模式,就额外需要一个适配器(sif4j-log4j 12来解决接口不兼容的问题。
(2) 日志库适配器,在一些老的工程里,一开始为了开发简单而直接使用了日志库API来完成日志打印,后来想修改为标准的门面模式,但老工程代码里打印日志太多,难以改动,所以需要一个适配器来完成从旧日志库的API到slf4j的路由,这样在不改动原有代码的情况下也能使用slf4j来统一管理日志,而且后续对日志库自由替换也不成问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值