5.【Java开发手册】| 异常日志

news2024/11/13 9:24:30

这里我就列出一些我认为应当遵守的,并且添加一些我自己在工作中的一些感受,如果照着文档抄,那完全变成练习打字了,浪费读者时间,如果你也认同我的看法,或者和我有类似感受,可以点个关注,共同进步,如果有不同意见,欢迎指出。

一、错误码

这个我就不列举阿里的规范要求了,因为大家都有自己的一套规则,这是阿里的定义方式,我觉得没有必要完全模仿。

首先错误码的作用就是,让我们能够快速定位到错误所在位置,并且在定义异常时能够有一个统一的标准。

错误码在设计指定规则的时候应当考虑支持不断追加的方式,以适应项目不断迭代带来的问题。

基于目前基本都是前后端分离的模式,基于 RESTful 风格,后端都是统一返回一个JSON格式的响应,而这个返回对象,通常包含,code,data, message 这些字段。

如果一切正常,也要返回一个错误码,阿里规定 00000,这个可以按照自己随便定义,我们规定的是20000,对应 Http 响应码 200

先介绍一下阿里的错误码制定规则:

  1. 使用字符串类型,共 5 位。错误来源 + 四位数字编码
  2. 错误来源分 用户/当前系统/第三方服务,分别对应 A/B/C
  3. 数字编码从 0001 到 9999,大类之间步长预留 100
  4. 错误码又分为三级,
    1. 每个来源的第一号,被定义为一级宏观错误码,比如 A0001/B0001/C0001
    2. 每个系统或者说模块中的开始被定义为二级宏观错误码,比如 A0100/A0200/B0300/C0400 (由步长决定)
    3. 具体在范围间的被定义为三级错误码,比如:A0101/B0102/C0103 这些。
    4. 00000 表示一切正常
  5. 错误码由统一平台管理,申请,审批生效。
  6. 避免随意定义新的错误码,尽可能在已经定义的错误码中找到语义相近的使用即可

我们可以参考阿里这套规则制定我们自己的一套规则,我之前会有疑惑步长100会不会不够用,后来想想,连阿里都够用了,我们这小公司还能超了不成,纯属多虑了。

二、异常处理

  1. 不要去捕获一下可以通过预检规避的 RuntimeException,比如一些查询结果可能为 null 的情况。
  2. 异常本来设计的初衷是解决一些意外情况,不要把他当作一种判断手段,我之前就碰到过这么写代码的同事,大概逻辑是,正常情况执行A流程,如果有异常则走B流程,这样做违背了异常设计的初衷,而且效率也比条件判断低很多。
  3. 捕获异常必要要处理它,不要捕获了什么都不做,这个我在 CodeReview 的时候就发现过,有的为了程序不抛出异常,手动 try 捕获,但是不做任何处理,这样有严重的安全隐患,隐藏了代码执行真实情况,如果不想处理可以抛出给上一层调用者。
  4. 在事务场景中,如果手动 catch 要注意可能会导致事务无法回滚。
  5. finally 块对资源对象或者流对象关闭的时候,有异常也要 try-catch
  6. finally 中不要写 return,否则会导致 try 块中的 return 失效。
  7. 捕获异常与抛出的异常要相匹配,或者捕获的是抛出异常的父类
  8. 一些注意NPE的场景
    1. 返回类型是基本类型,但是 return 的时候给的是包装类型,自动拆箱的时候可能产生 NPE
    2. 数据库查询结果可能是 null
    3. 集合里的元素即使是 isNotEmpty,取出的数据也可能是 null
    4. 远程调用返回对象时,一路要进行非空判断
    5. 对于 Sesson 中获取的数据,建议进行 NPE 判断
    6. 级联调用的时候,obj.getA().getB().getC(),易产生NPE
  9. 对于抛出去的异常使用具有业务含义的自定义异常

三、日志规约

  1. 使用 SLF4J,有利于维护和各个类的日志处理方式统一
  2. 日志文件至少保存 15 天,当天日志以 “应用名.log” 来保存,保存在/{统一目录}/{应用名}/logs/目录下,历史日志格式:{logname}.log.{保存日期},日期格式 yyy-MM-dd
  3. 根据国家法律,网络运行状态、网络安全事件、个人敏感信息操作等相关记录,留存的日志不少于六个月,并且进行网络多机备份。
  4. 应用中的扩展日志(如打点、临时监控、访问日志等)命名方式:appName_logType_logName.log。logType:日志类型,如stats/monitor/access等;logName:日志描述。这种命名的好处:通过文件名就可知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。
  5. 在日志输出时,字符串变量之间的拼接使用占位符的方式。

说明:因为String字符串的拼接会使用StringBuilder的append()方式,有一定的性能损耗。使用占位符仅是替换动作,可以有效提升性能。正例:logger.debug(“Processing trade with id:{} and symbol:{}”,id,symbol);

  1. 对于trace/debug/info级别的日志输出,必须进行日志级别的开关判断:
  2. 避免重复打印日志,浪费磁盘空间,务必在日志配置文件中设置 additivity=false
  3. 日志打印时禁止直接用JSON工具将对象转换成String,使用对象的 toString 方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2116064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java 优选算法】双指针(上)

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 移动零 分析 代码 复写零 分析 代码 快乐数 分析 代码 盛最多水的容器 分析 代码 移动零 题目链接 分析 双指针算法,利用两个指针cur和dest将数组划分为三个区间…

Java题集综合实践——简易计算器制作

此系列文章收录大量Java经典代码题(也可以算是leetcode刷题指南),剩余文章指路Java题集。希望可以与大家一起探索Java的神秘。3、2、1,请看! 本篇文章将带大家编写一个简易算术计算器。 功能:将几个算术功…

VBA经典应用69例应用6:格式化代码中的双引号(””)和井号(#)

《VBA经典应用69例》(版权10178981),是我推出的第九套教程,教程是专门针对初级、中级学员在学习VBA过程中可能遇到的案例展开,这套教程案例众多,紧贴“实战”,并做“战术总结”,以便…

使用java做一个微信机器人

如何使用Java开发微信机器人 在当今社交网络盛行的时代,微信已成为人们生活中不可或缺的工具。为了更好地服务用户,许多企业和个人开始利用微信机器人来自动化回复消息、发布信息等操作。本文将介绍如何使用Java开发一个简单的微信机器人,并…

html基础语法 看这一篇就够了!

HTML 一 概念 html:html 文件根标签 head:编写页面相关的属性 title:页面标题 body:页面内容展示信息 二 DOM 树&#xff1a; 所有的标签都是 html 的子标签 head 和 body 是兄弟标签&#xff0c;同一级别 head 和 title 为父子标签 1.第一个程序 <html><head>…

音视频入门基础:WAV专题(9)——FFmpeg源码中计算WAV音频文件每个packet的duration和duration_time的实现

一、引言 从文章《音视频入门基础&#xff1a;WAV专题&#xff08;6&#xff09;——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道&#xff0c;通过FFprobe命令可以显示WAV音频文件每个packet&#xff08;也称为数据包或多媒体包&#xff09;的信息&#xff0…

苹果电脑可以玩《原神》吗?原神可以在Mac上玩吗?苹果电脑玩原神怎么样

《原神》是一款由米哈游开发的开放世界冒险游戏&#xff0c;自从2020年正式上线以来&#xff0c;就受到了全球玩家的热烈欢迎。《原神》的画面精美&#xff0c;音乐动听&#xff0c;剧情丰富&#xff0c;角色多样&#xff0c;玩法多变&#xff0c;让人沉浸在一个充满奇幻和魅力…

【Python 学习】Pandas基础与应用(1)

题目 1 Pandas 简介1.1 主要特征1.2 Pandas 安装 2 Pandas中的数据结构2.1 Series 数据结构和操作2.1.1 Series的数据结构2.1.2 Seres的操作 2.2 DataFrame 数据结构和操作2.2.1 DataFrame 数据结构2.2.2 Dataframe 操作2.2.3 DateFrame 的特殊操作 2.3 Series 和 DataFrame 的…

LRU go cache的实现

目录 LRU算法LRU原理LRU实现Redis LRU算法实现1. 内存淘汰策略2. LRU算法的实现3. LRU vs LFURedis中的LRU使用场景 基于LRU的缓存库go-cache安装使用代码解析 hashicorp/golang-lru安装使用代码解析 groupcache安装使用代码解析缓存淘汰算法并发缓存组一致性哈希防止缓存击穿—…

从电商行业的变化引出未来技术趋势

时间&#xff1a;2024年09月08日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频地址&#xff1a;喜马拉雅 希望大家帮个忙&#xff01;如果大家有工作机会&#xff0c;希望帮小蒋推荐一下&#xff0c;小蒋希望遇到一个认真…

无人机人工增雨技术详解

无人机&#xff0c;全称为无人驾驶飞行器&#xff08;Unmanned Aerial Vehicle, UAV&#xff09;&#xff0c;是一种不需要人员直接操控&#xff0c;而是利用先进的遥控技术、自主飞行控制系统和传感器技术来实现空中飞行和完成特定任务的飞行器。 一、技术原理 无人机人工增雨…

轻NAS系统CasaOS设备安装Memos笔记结合内网穿透公网访问与同步教程

文章目录 前言1. 使用Docker部署memos2. 注册账号与简单操作演示3. 安装cpolar内网穿透4. 创建公网地址5. 创建固定公网地址 前言 本文主要介绍如何在安装了轻NAS系统CasaOS设备中使用Docker本地部署开源云笔记服务memos&#xff0c;并结合cpolar内网穿透工具配置公网地址&…

C/C++两点坐标求距离以及C++保留两位小数输出,秒了

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 3. 备注 1. 前言 依旧是带来一个练手的题目&#xff0c;目的就一个&#xff0c;方法千千万&#xff0c;通向终点的方式有很多种&#xff0c;没有谁与谁&#xff0c;我们都是为了成为更好的自己。…

VMware Fusion 虚拟机Mac版 安装CentOS系统教程

Mac分享吧 文章目录 CentOS安装完成&#xff0c;软件打开效果一、Mac中使用虚拟机安装CentOS系统1️⃣&#xff1a;下载镜像2️⃣&#xff1a;创建虚拟机3️⃣&#xff1a;设置虚拟机4️⃣&#xff1a;安装虚拟机5️⃣&#xff1a;设置成从磁盘启动 安装完成&#xff01;&…

哈希表如何避免冲突

系列文章&#xff1a; 1. 先导片--Map&Set之二叉搜索树 2. Map&Set之相关概念 3. 哈希表如何避免冲突 目录 1.概念 2. 冲突-概念 3. 冲突-避免 3.1 冲突-避免-哈希函数设计 3.2 冲突-避免-负载因子调节 4. 冲突-解决 4.1 冲突-解决-闭散列 4.1.1 线性探…

C++_15_类与对象

类与对象 什么是类&#xff1f; 描述有共同特征的事务的概念 作用&#xff1a;代码中 创建对象 什么是对象&#xff1f; 生活中&#xff1a; 就是指真实存在的事物。 代码中&#xff1a; 模拟真实的事物&#xff0c;使用类创建得到。 类与对象的关系 生活中&#xff1a; ​ 先…

VMware vSphere5.0关闭虚拟机电源时,报错从ESXI主机接收到错误

ESXI和VCENTER都是5.0版本的&#xff0c;有台虚拟机关机报错提示从ESXI主机接受到意外错误 具体报错信息如下&#xff1a; 从VCENTER平台对该虚拟机做任何操作都无法生效&#xff0c;后来查看了虚拟机的网络和端口&#xff0c;发现SSH能正常联通&#xff0c;进入虚拟机后使用命…

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码 2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法&#xff0c;这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列…

Pencils Protocol生态新进展,即将上线 Vault 产品

“极高的盈利预期、通证的持续回购与销毁&#xff0c;Vault产品的推出正在成为Pencils Protocol生态发展的重磅利好。” Pencils Protocol是目前Scroll生态TVL最高的DeFi平台 &#xff0c;即便是行情整体较为平淡&#xff0c;其仍旧能够保持在3亿美元左右的锁仓价值&#xff0c…

史上最全的Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了!

command &#xff1a;命令名&#xff0c;相应功能的英文单词或单词的缩写[-options] &#xff1a;选项&#xff0c;可用来对命令进行控制&#xff0c;也可以省略parameter &#xff1a;传给命令的参数&#xff0c;可以是 零个、一个 或者 多个 查阅命令帮助信息 -help 说明&…