Java开发手册6

这篇具有很好参考价值的文章主要介绍了Java开发手册6。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

异常日志

异常处理

  1. 【强制】Java类库中定义的可以通过预检查方式规避的RuntimeException异常不应该通过catch的方式来处理,比如:NullPointerExceptionIndexOutOfBoundsException等等。 说明:无法通过预检查的异常除外,比如,在解析字符串形式的数字时,可能存在数字格式错误,不得不通过catch NumberFormatException来实现。
    正例:if (obj != null) {…}
    反例:try{ obj.method();} catch(NullPointerException e) {…}

  2. 【强制】异常捕获后不要用来做流程控制,条件控制。
    说明:异常设计的初衷是解决程序运行中的各种意外情况,且异常的处理效率比条件判断方式要低很多。

  3. 【强制】catch时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的catch尽可能进行区分异常类型,再做对应的异常处理。
    说明:对大段代码进行try-catch,使程序无法根据不同的异常做出正确的应激反应,也不利于定位问题,这是一种不负责任的表现。
    正例:用户注册的场景中,如果用户输入非法字符,或用户名称已存在,或用户输入密码过于简单,在程序上作出分门别类的判断,并提示给用户。

  4. 【强制】捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常 抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。

  5. 【强制】事务场景中,抛出异常被catch后,如果需要回滚,一定要注意手动回滚事务。

  6. 【强制】finally块必须对资源对象、流对象进行关闭,有异常也要做try-catch
    说明:如果JDK7,可以使用try-with-resources方式。

  7. 【强制】不要在finally块中使用return
    说明:try 块中的return语句执行成功后,并不马上返回,而是继续执行finally块中的语句,如果此处存在return语句,则会在此直接返回,无情丢弃掉try块中的返回点。
    反例:

private int x = 0;
public int checkRetum() {
   try { 
      //x等于1,此处不返回
      return ++x;
   } finally { 
      //返回的结果是2 
      return ++x;
   }
}
  1. 【强制】捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。
    说明:如果预期对方抛的是绣球,实际接到的是铅球,就会产生意外情况。
  2. 【推荐】方法的返回值可以为 null,不强制返回空集合,或者空对象等,必须添加注释充分说明什么情况下会返回null值。
    说明:本规约明确防止NPE是调用者的责任。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败,运行时异常等场景返回null的情况。
  3. 【推荐】防止NPE,是程序员的基本修养,注意NPE产生的场景:
    (1)返回类型为基本数据类型,return包装数据类型的对象时,自动拆箱有可能产生NPE
    反例:public int method() { return Integer对象;},如果为null,自动解箱抛NPE
    (2)数据库的查询结果可能为 null
    (3)集合里的元素即使isNotEmpty,取出的数据元素也可能为null
    (4)远程调用返回对象时,一律要求进行空指针判断,防止NPE
    (5)对于 Session 中获取的数据,建议进行 NPE 检查,避免空指针。
    (6)级联调用obj.getA().getB().getC();一连串调用,易产生NPE
    正例:使用JDK8Optional类来防止NPE问题。
  4. 【推荐】定义时区分 unchecked /checked 异常,避免直接抛出 new RuntimeException(),更不允许抛出 Exception 或者Throwable,应使用有业务含义的自定义异常。推荐业界已定义过的自定义异常,如:DAOException/ServiceException等。
  5. 【参考】对于公司外的http/api开放接口必须使用错误码,而应用内部推荐异常抛出;跨应用间RPC调用优先考虑使用Result方式,封装isSuccess()方法、错误码、错误简短信息;应用内部推荐异常抛出。
    说明:关于RPC方法返回方式使用Result方式的理由:
    (1)使用抛异常返回方式,调用方如果没有捕获到就会产生运行时错误。
    (2)如果不加栈信息,只是new自定义异常,加入自己的理解的error message,对于调用端解决问题的帮助不会太多。如果加了栈信息,在频繁调用出错的情况下,数据序列化和传输的性能损耗也是问题。

日志规约

  1. 【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架(SLF4J、JCL——Jakarta Commons Logging)中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
    说明:日志框架(SLF4J、JCL--Jakarta Commons Logging)的使用方式(推荐使用SLF4J),使用SLF4J:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory 
private static final Logger logger = LoggerFactory.getLogger(Test.class);
  1. 【强制】日志文件至少保存15天,因为有些异常具备以“周”为频次发生的特点。对于当天日志,以 “应用名.log”来保存,保存在/统一目录》/{应用名|/logs/目录下,过往日志格式为:{logname}.log.{保存日期},日期格式:yyy-MM-dd
    正例:< 以mppserver应用为例,日志保存/home/admin/mppserver/logs/mppserver.log,历史日志名称为mppserver.log.2021-11-28

  2. 【强制】应用中的扩展日志(如打点、临时监控、访问日志等)命名方式: appName_logType_logNamelogType:日志类型,如stats/monitor/access等;logName:日志描述。这种命名的好处:通过文件名就可知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。
    说明:推荐对日志进行分类,将错误日志和业务日志分开放,便于开发人员查看,也便于通过日志对系统进行及时监控。
    正例:mppserver应用中单独监控时区转换异常,如:mppserver_monitor_timeZoneConvert.log

  3. 【强制】在日志输出时,字符串变量之间的拼接使用占位符的方式。
    说明:因为String字符串的拼接会使用StringBuilderappend()方式,有一定的性能损耗。使用占位符仅是替换动作,可以有效提升性能。
    正例:logger.debug("Processing tradewith id: {} and symbol:{}", id, symbol);

  4. 【强制】对于trace/debug/info级别的日志输出,必须进行日志级别的开关判断:
    说明:虽然在debug(参数)的方法体内第一行代码isDisabled(Level.DEBUG_INT)为真时(SIf4j的常见实现Log4j和Logback),就直接return,但是参数可能会进行字符串拼接运算。此外,如果debug(getName())这种参数内有getName()方法调用,无谓浪费方法调用的开销。
    正例:

//如果判断为真,那么可以输出trace和debug级别的日志
if (logger.isDebugEnabled()) {
   logger.debug("Current ID is:{} and name is: 0", id, getName());
}
  1. 【强制】避免重复打印日志,浪费磁盘空间,务必在日志配置文件中设置additivity=false
    正例:<logger name="com.taobao.dubbo.config"additivity=“false”>

  2. 【强制】生产环境禁止使用System.outSystem.err输出或使用e.printStackTrace()打印异常堆栈。
    说明:标准日志输出与标准错误输出文件每次Jboss重启时才滚动,如果大量输出送往这两个文件,容易造成文件大小超过操作系统大小限制。

  3. 【强制】异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字throws往上抛出。
    正例: logger.error("inputParams:{} and errorMessage:{}",各类参数或者对象toString(), e.getMessage(), e);

  4. 【强制】日志打印时禁止直接用JSON工具将对象转换成String
    说明:如果对象里某些get方法被覆写,存在抛出异常的情况,则可能会因为打印日志而影响正常业务流程的执行。
    正例:打印日志时仅打印出业务相关属性值或者调用其对象的toString()方法。

  5. 【推荐】谨慎地记录日志。生产环境禁止输出debug日志;有选择地输出info日志;如果使用warn来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。

    说明:
    大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些日志真的有人看吗?

  6. 【推荐】谨慎地记录日志。生产环境禁止输出debug日志;有选择地输出info日志;如果使用warn来记录刚可以使用warn日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从。如非必要,请不要在此场景打出error级别,避免频繁报警。

    说明:
    注意日志输出的级别,error级别只记录系统逻辑出错、异常或者重要的错误信息。

  7. 【推荐】尽量用英文来描述日志错误信息,如果日志中的错误信息用英文描述不清楚的话使用中文描述即可,否则容易产生歧义。

    说明:
    国际化团队或海外部署的服务器由于字符集问题,使用全英文来注释和描述日志错误信息。

  8. 【推荐】为了保护用户隐私,日志文件中的用户敏感信息需要进行脱敏处理。
    说明:
    日志排查问题时,推荐使用订单号、UUID之类的唯一编号进行查询。文章来源地址https://www.toymoban.com/news/detail-434938.html

到了这里,关于Java开发手册6的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • DRF:配置全局异常处理和日志结合

    项目目录结构 ---study_drf         ---study_drf                 ---settings.py         ---utils                 ---log.py                 ---exception.py 项目依赖 要使用drf的Response做为响应对象,需要先注册app settings.py 1、setting.py配置日志 2、utils/log.py,拿到配置的日志处理对象,实

    2024年02月12日
    浏览(13)
  • 推荐Java开发常用的工具类库google guava

    Guava Guava是一个Google开源的Java核心库,它提供了许多实用的工具和辅助类,使Java开发更加简洁、高效、可靠。目前和 hutool 一起,是业界常用的工具类库。 shigen 也比较喜欢使用,在这里列举一下常用的工具类库和使用的案例。 参考: 整理一波Guava的使用技巧 - 掘金 Guava中这

    2024年02月09日
    浏览(12)
  • springboot全局异常处理和自定义异常处理

    在spring项目中,优雅处理异常,好处是可以将系统产生的全部异常统一捕获处理,自定义的异常也由全局异常来捕获,如果涉及到validator参数校验器使用全局异常捕获也是较为方便。 GlobalExceptionHandler类: 自定义异常CustomException类: 通用返回类:AjaxResult 枚举类ResultCodeEnum:

    2024年02月04日
    浏览(8)
  • Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

    Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

    目录 一、单个控制器异常处理 1.1 控制器方法 1.2 编写出错页面 1.3 测试结果 二、全局异常处理 2.1 一个有异常的控制器类 2.2 全局异常处理器类 2.3 测试结果  三、自定义异常处理器 3.1 自定义异常处理器 3.2 测试结果 往期专栏文章相关导读  1. Maven系列专栏文章 2. Mybatis系列

    2024年02月16日
    浏览(14)
  • Spring Boot 优雅实现统一数据返回格式+统一异常处理+统一日志处理

    Spring Boot 优雅实现统一数据返回格式+统一异常处理+统一日志处理

            在我们的项目开发中,我们都会对数据返回格式进行统一的处理,这样可以方便前端人员取数据,当然除了正常流程的数据返回格式需要统一以外,我们也需要对异常的情况进行统一的处理,以及项目必备的日志。         在项目开发中返回的是json格式的数据

    2024年01月19日
    浏览(18)
  • SpringBoot异常处理(Whitelabel Error Page和自定义全局异常处理页面)和整合ajax异常处理

    SpringBoot异常处理(Whitelabel Error Page和自定义全局异常处理页面)和整合ajax异常处理

    SpringBoot默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求。在 springBoot 中提供了一个叫 BasicErrorController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息 自定义该页面显示内容

    2024年01月16日
    浏览(17)
  • dubbo处理自定义异常

    dubbo处理自定义异常

    背景 在实际项目中,我们不可避免地需要使用自定义的异常,一般这个异常会继承RuntimeException,然后我们通过@RestControllerAdvice注解,拦截业务异常类,做一些处理,但是在使用dubbo构建项目时,会发现provider抛出自定义异常,然后在消费者端,不会捕捉到我们的自定义异常,

    2024年02月05日
    浏览(12)
  • 【Java基础教程】(三十七)常用类库篇 · 第七讲:日期时间处理类——三万字全面讲解 LocalDateTime和 DateTimeFormatter,Date、Calendar ~

    【Java基础教程】(三十七)常用类库篇 · 第七讲:日期时间处理类——三万字全面讲解 LocalDateTime和 DateTimeFormatter,Date、Calendar ~

    Java的时间处理相关类主要是为了提供灵活、可靠地处理日期和时间的能力,以满足各种应用程序中对时间的需求。这些类旨在简化日期和时间的操作,并提供一致的方法和功能来处理时间上的计算、格式化和解析。 🔍 时间日期及处理类汇总 将Java中所有用于表示日期时间的

    2024年02月16日
    浏览(20)
  • 低代码前端开发者必备:异常监控日志系统

    低代码前端开发者必备:异常监控日志系统

    某客户:“你们的系统怎么又报错了?给你们一天时间修好,等着用!” 沟通中:询问客户具体问题,他表示某某功能用不了,某某功能也用不了,而且无法复现。 - 你会怎么处理? 答案1:先看看说明书? 答案2:好的,我们马上安排研发团队查找问题,顺便也请您帮忙看

    2024年04月13日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包