06/31Day 孤尽训练营笔记分享

31 篇文章 1 订阅

        任务: T31购票系统日志、异常、错误码设计
        内容、实操:
      1、完成购票系统的日志
      2、错误码与异常处理的设计
        产出结果: 日志设计文档、错误码设计文档、异常处理设计文档

日志

      日志就是记录程序的运行轨迹,方便查找关键信息,也方便快速定位解决问题。

  日志级别

• OFF 关闭 :最高级别,不输出日志。
• FATAL 致命:输出非常严重的可能会导致应用程序终止的错误。
• ERROR 错误:输出错误,但应用还能继续运行。
• WARN 警告:输出可能潜在的危险状况。
• INFO 信息:输出应用运行过程的详细信息。
• DEBUG 调试:输出更细致的对调试应用有用的信息。
• TRACE 跟踪:输出更细致的程序运行轨迹。
• ALL 所有:输出所有级别信息。

     日志优先级别标准顺序为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

  项目开发中打日志的基本格式:

     正确的姿势

logger.debug("Processing trade with param1:[{}] and param2: [{}] ", param1, param2); 

     不推荐的姿势:这种会进行字符串的拼接,产生很多String对象,占用空间,影响性能。

logger.debug("Processing trade with param1: " + param1 + " param2: " + param2);

异常

       Java异常是Java提供的一种识别及响应错误的一致性机制。
Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出。

Java异常机制用到的几个关键字: try、catch、finally、throw、throws。

• try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
• catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。
• finally – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
• throw – 用于抛出异常。
• throws – 用在方法签名中,用于声明该方法可能抛出的异常。

   Java异常架构图

在这里插入图片描述

1. Throwable
  Throwable是 Java 语言中所有错误或异常的超类。
  Throwable包含两个子类: Error 和 Exception。它们通常用于指示发生了异常情况。
  Throwable包含了其线程创建时线程执行堆栈的快照,它提供了printStackTrace()等接口用于获取堆栈跟踪数据等信息。

2. Exception
  Exception及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。

3. RuntimeException
  RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。
  编译器不会检查RuntimeException异常。例如,除数为零时,抛出ArithmeticException异常。RuntimeException是ArithmeticException的超类。当代码发生除数为零的情况时,倘若既"没有通过throws声明抛出ArithmeticException异常",也"没有通过try…catch…处理该异常",也能通过编译。这就是我们所说的"编译器不会检查RuntimeException异常"!
  如果代码会产生RuntimeException异常,则需要通过修改代码进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!

4. Error
  和Exception一样,Error也是Throwable的子类。它用于指示合理的应用程序不应该试图捕获的严重问题,大多数这样的错误都是异常条件。
  和RuntimeException一样,编译器也不会检查Error。

Java将可抛出(Throwable)的结构分为三种类型:被检查的异常(Checked Exception),运行时异常(RuntimeException)和错误(Error)。

(01) 运行时异常
定义: RuntimeException及其子类都被称为运行时异常。
特点: Java编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。例如,除数为零时产生的ArithmeticException异常,数组越界时产生的IndexOutOfBoundsException异常,fail-fail机制产生的ConcurrentModificationException异常等,都属于运行时异常。虽然Java编译器不会检查运行时异常,但是我们也可以通过throws进行声明抛出,也可以通过try-catch对它进行捕获处理。
   如果产生运行时异常,则需要通过修改代码来进行避免。 例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!

(02) 被检查的异常
定义: Exception类本身,以及Exception的子类中除了"运行时异常"之外的其它子类都属于被检查异常。
特点: Java编译器会检查它。此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。例如,CloneNotSupportedException就属于被检查异常。当通过clone()接口去克隆一个对象,而该对象对应的类没有实现Cloneable接口,就会抛出CloneNotSupportedException异常。
  被检查异常通常都是可以恢复的。

(03) 错误
定义: Error类及其子类。
特点: 和运行时异常一样,编译器也不会对错误进行检查。
  当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误。程序本身无法修复这些错误的。例如,VirtualMachineError就属于错误。
  按照Java惯例,我们是不应该是实现任何新的Error子类的!

对于上面的3种结构,我们在抛出异常或错误时,到底该哪一种?《Effective Java》中给出的建议是:对于可以恢复的条件使用被检查异常,对于程序错误使用运行时异常。

错误码

          以下为孤尽老师写的java阿里规范有关错误码规约

  1. 【强制】 错误码的制定原则:快速溯源、沟通标准化。
    说明: 错误码想得过于完美和复杂,就像康熙字典中的生僻字一样,用词似乎精准,但是字典不容易随身
    携带并且简单易懂。
    正例:错误码回答的问题是谁的错?错在哪?1)错误码必须能够快速知晓错误来源,可快速判断是谁的问
    题。2)错误码必须能够进行清晰地比对(代码中容易 equals)。3)错误码有利于团队快速对错误原因达
    到一致认知。
  1. 【强制】 错误码不体现版本号和错误等级信息。
    说明:错误码以不断追加的方式进行兼容。错误等级由日志和错误码本身的释义来决定。
  1. 【强制】 全部正常,但不得不填充错误码时返回五个零:00000。
  1. 【强制】 错误码为字符串类型,共 5 位,分成两个部分:错误产生来源+四位数字编号。
    说明:错误产生来源分为 A/B/C,A 表示错误来源于用户,比如参数错误,用户安装版本过低,用户支付
    超时等问题;B 表示错误来源于当前系统,往往是业务逻辑出错,或程序健壮性差等问题;C 表示错误来源
    于第三方服务,比如 CDN 服务出错,消息投递超时等问题;四位数字编号从 0001 到 9999,大类之间的
    步长间距预留 100,参考文末附表 3。
  1. 【强制】 编号不与公司业务架构,更不与组织架构挂钩,以先到先得的原则在统一平台上进行,
    审批生效,编号即被永久固定。
  1. 【强制】 错误码使用者避免随意定义新的错误码。
    说明:尽可能在原有错误码附表中找到语义相同或者相近的错误码在代码中使用即可。
  1. 【强制】 错误码不能直接输出给用户作为提示信息使用。
    说明:堆栈(stack_trace)、错误信息(error_message)、错误码(error_code)、提示信息(user_tip)
    是一个有效关联并互相转义的和谐整体,但是请勿互相越俎代庖。
  1. 【推荐】 错误码之外的业务独特信息由 error_message 来承载,而不是让错误码本身涵盖过
    多具体业务属性。
  1. 【推荐】 在获取第三方服务错误码时,向上抛出允许本系统转义,由 C 转为 B,并且在错误信
    息上带上原有的第三方错误码。

10.【参考】 错误码分为一级宏观错误码、二级宏观错误码、三级宏观错误码。
说明:在无法更加具体确定的错误场景中,可以直接使用一级宏观错误码,分别是:A0001(用户端错误)B0001(系统执行出错)、C0001(调用第三方服务出错)。
正例:调用第三方服务出错是一级,中间件错误是二级,消息服务出错是三级。

11.【参考】 错误码的后三位编号与 HTTP 状态码没有任何关系。

12…【参考】 错误码有利于不同文化背景的开发者进行交流与代码协作。
说明:英文单词形式的错误码不利于非英语母语国家(如阿拉伯语、希伯来语、俄罗斯语等)之间的开发
者互相协作。

13…【参考】 错误码即人性,感性认知+口口相传,使用纯数字来进行错误码编排不利于感性记忆
和分类。
说明:数字是一个整体,每位数字的地位和含义是相同的。 反例:一个五位数字 12345,第 1 位是错误等级,第 2 位是错误来源,345 是编号,人的大脑不会主动地
拆开并分辨每位数字的不同含义。

参考网址:https://blog.csdn.net/xiaoao20080/article/details/91285284
                  https://www.cnblogs.com/skywang12345/p/3544168.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值