错误码与错误提示设计

1、背景介绍

        在软件开发的复杂世界中,错误是不可避免的。无论是因为外部系统的变化、用户输入的错误,还是内部逻辑的缺陷,错误都会出现。为了有效管理这些错误,并向用户和开发者提供清晰、有用的反馈,设计一套合理的错误码和错误提示系统变得至关重要。 因此 一方面需要满足开发者的错误设计,另外也需要将错误友好的反馈给用户。

        需要注意的是,错误说明是展示给用户的,最好直接告诉用户“该怎么做”而不是“哪里错了”,并且错误说明中不应该包含敏感信息(例如:堆栈信息)。但是为了方便问题排查,我们可以在系统内部日志中打印详细的错误堆栈信息。

        制定一套错误码规约还是相对容易的,难的是在长期的实践中如何管理并正确使用错误码,保证不被滥用,其复杂程度跟项目规模相匹配。在规约设计时,应该以服务业务为导向,避免过度设计,保持简洁;在管理使用时,应该以先到先得的原则统一审批生效,生效后永久固定。以上就是我对于错误码规约制定一些想法,规则的制定是灵活的,可变通的,同样也没有绝对的好与坏,只要可以满足你的业务需求就是好的,优秀的。

2、软件内部框架好的错误码与错误提示设计是什么样?

2.1、错误码

2.1.1、错误码设计原则

  1. 快速溯源:错误码应能迅速帮助开发者定位问题来源,减少排查时间。
  2. 沟通标准化:在团队内部或跨团队之间,错误码的设计应遵循统一的规范,以降低沟通成本。
  3. 业务属性:错误码应体现业务系统的报错位置及原因,赋予一定的业务属性。
  4. 唯一性:错误码必须是错误的唯一标识,避免重复和混淆。
  5. 可扩展性:在设计时应预留一定范围的代码用于未来可能出现的新错误。

2.1.2、错误码设计方案

  1. 格式规范
    • 错误码可以采用字符数字组合表示,例如使用四段式结构,每段表示不同含义(如系统标识、错误类型、错误级别、序列号等)。
    • 错误码内容格式应固定,统一长度,便于管理和使用。
  2. 内容清晰
    • 错误码的内容应简明扼要,能够直接反映错误类型或原因。
    • 避免使用模糊或技术性的语言,确保开发者和用户都能理解。
  3. 文档化
    • 将所有错误码和错误提示信息文档化,并保持文档的最新状态。
    • 文档应包含错误码的详细说明、触发条件、解决方案等信息。

2.2、错误提示

2.2.1、错误提示设计原则

  1. 简洁明了:错误提示应使用简洁明了的语言,避免冗长和复杂的表述。
  2. 必要信息:错误提示应包含必要的信息,帮助用户快速理解问题所在。
  3. 避免技术术语:尽量避免使用专业的技术术语,以减少用户的理解难度。
  4. 提供解决方案:如果可能,错误提示应提供解决问题的建议或行动指导。
  5. 情感友好:错误提示应保持情感友好,避免使用否定词或责备用户的语言。

2.2.2、错误提示设计方案

  1. 结构化展示
    • 错误提示可以采用结构化的方式展示,如包含错误码、错误说明、解决方案等部分。
    • 对于复杂的错误,可以提供详细的错误堆栈信息或参考文档链接,但应确保这些信息对普通用户隐藏或可选显示。
  2. 位置合理
    • 错误提示应出现在用户易于发现的位置,如表单提交后的页面顶部或错误字段附近。
    • 确保用户无需滚动页面即可看到错误提示。
  3. 视觉突出
    • 使用醒目的颜色或图标来突出显示错误提示,以吸引用户的注意力。
    • 确保错误提示在视觉上与其他页面元素区分开来。

3、错误码及日志开源框架有哪些?

        以下是一些开源框架,它们提供了强大的错误码处理功能,帮助开发者高效地管理和调试软件错误。

3.1、Slim Whoops

   - 项目地址:https://gitcode.com/zeuxisoo/php-slim-whoops
   - 特点:Slim Whoops 是一个为 PHP Slim 框架设计的优雅错误处理工具。它基于 Composer 安装,支持多种版本的 Slim 框架,从 v1 到 v4。通过简单的中间件集成,可以轻松地添加到 Slim 应用中。其核心特性在于使用了 Whoops 库,该库以其友好的界面和强大的错误信息展示而闻名。


3.2、FeedbackReporter

   - 项目地址:https://gitcode.com/tcurdt/feedbackreporter
   - 特点:FeedbackReporter 框架旨在简化桌面应用的错误报告流程。它采用模块化设计,包括异常处理、调用栈跟踪等功能,并且易于集成到应用程序中。该框架借鉴了 Fraser Speirs 和 Jens Alfke 的工作成果,如 Multipart/Form 构造和异常处理,保证了高质量的错误报告。


3.3、Gin框架

   - 项目地址:https://github.com/gin-gonic/gin
   - 特点:Gin 是一个用 Go 语言编写的 HTTP web 框架,它提供了错误码处理机制,帮助开发者更好地处理异常情况,提高程序的健壮性。在 Gin 框架中,开发者可以定义错误码,封装错误处理函数,并在路由处理函数中使用这些函数来处理不同类型的异常情况。


3.4、melonDB

   - 项目地址:https://github.com/Water-Melon/Melon
   - 特点:melonDB 是一个
用 C 语言编写的开源数据库,它提供了错误码管理功能。melonDB 的错误码设计独特,使用 32 位整数表示,其中包含了错误码、源文件路径和行号等信息。这种设计使得错误信息更加丰富,有助于开发者快速定位和解决问题。

4、日志监控及分析工具

        从可维护性角度来讲,有了好的错误码及错误日志,那么日志分析及监控工具的设计是比较简单。有利于开发、测试、运维人员进行错误的分析,快速的定位问题。      

        开源的日志工具:如Logstash、Fluentd等,可以帮助收集和分析错误日志,从而发现错误码的使用情况和潜在问题。
        开源的监控工具:如Prometheus、Grafana等,可以实时监控系统的运行状态和错误情况,及时发现并解决问题。

5、用户操作错误设计

        用户操作错误提示的设计应以提高用户体验为目标,确保错误信息的明确性、友好性、可见性和及时性。同时,遵循设计原则并考虑自定义与可扩展性,以满足不同用户的需求和期望。

1. 明确性
错误描述清晰:错误提示应直接明了地指出问题所在,避免使用模糊或技术性的语言。确保用户能够理解错误信息的含义,并知道如何解决问题。
错误码与说明结合:如果系统使用错误码,那么错误提示应同时包含错误码和相应的解释说明。这样,用户可以通过错误码快速查找解决方案,而解释说明则有助于非技术用户理解问题。
2. 友好性
情感友好:错误提示应保持情感友好,避免使用责备或消极的语言。采用积极、鼓励的语气,让用户感受到系统的帮助和支持。
提供解决方案:如果可能,错误提示应提供解决问题的建议或行动指导。这有助于用户快速恢复操作,减少挫败感。
3. 可见性
位置合理:错误提示应出现在用户易于发现的位置,如页面顶部、错误字段附近或弹出窗口中。确保用户无需滚动页面即可看到错误提示。
视觉突出:使用醒目的颜色、图标或字体样式来突出显示错误提示,以吸引用户的注意力。
4. 反馈及时性
即时反馈:在用户进行操作时,系统应即时反馈操作结果。如果操作有误,应立即显示错误提示,避免用户在不明确的状态下继续操作。
进度提示:对于需要等待的操作,系统应提供进度提示,让用户知道操作正在进行中以及预计的完成时间。
5. 自定义与可扩展性
错误码管理:建立统一的错误码管理系统,确保错误码的唯一性和规范性。同时,为未来的新错误预留扩展空间。
本地化支持:根据用户的语言偏好和地区设置,提供本地化的错误提示信息,以增强用户体验。
6. 遵循设计原则
简洁明了:避免在错误提示中堆砌过多信息,保持信息的简洁性和针对性。
一致性:保持错误提示的设计风格、语言风格和操作方式的一致性,以降低用户的学习成本。
可访问性:确保错误提示信息对所有用户都是可访问的,包括视觉、听觉或运动障碍用户。

6、参考

6.1、参考网站

https://zhuanlan.zhihu.com/p/651916931

https://zhuanlan.zhihu.com/p/486899287

https://juejin.cn/post/7094128414772166663

https://cloud.tencent.com/developer/article/2409169

6.2、错误码实例

6.2.1、枚举类错误码

// 在下面的代码中只给出了部分有代表性的错误码
@Getter
@AllArgsConstructor
public enum CommonErrorEnum implements IResponseEnum {/*** 成功*/SUCCESS("000000", 200, "SUCCESS"),/*** 参数校验(Valid)异常*/PARAM_VALID_ERROR("U00P01", 400, "参数校验异常"),/*** Token已过期*/TOKEN_EXPIRED("U00A02", 401, "Token已过期"),/*** 未授权,不能访问*/AUTH_INVALID("U00A05", 403, "未授权,不能访问"),/*** 服务器繁忙,请稍后重试*/SERVER_BUSY("U00S00", 500,"服务器繁忙"),/*** 未知异常,无法识别的异常*/SERVER_ERROR("U00O99", 500, "未知异常"),/*** Servlet请求类异常(部分)*/NoHandlerFoundException("U00N02", 404, "资源找不到"),HttpRequestMethodNotSupportedException("U00N03", 405, "HTTP请求方式不受支持"),HttpMediaTypeNotSupportedException("U00N05", 415, "HTTP请求头的 Content-Type 不受支持"),;/*** 返回码*/private String code;/*** 状态码*/private Integer http;/*** 返回消息*/private String message;
// /**
// * 参考文档 (可选)
// */
// private String reference;
}

6.2.2、错误码设计方案

错误码实例方案,

错误码应该是统一长度,且内容格式也应该固定的,而不应该是随机编码产生的。其内容可以是一个整数,也可以是一个字符串,但它必须是错误的唯一标识。 通过研究对比各个平台的错误码,我总结出了一个比较实用的错误码设计方案:使用字符数字组合表示,一共有4段组成,不同段表示不同含义(应用标识、模块、错误类型、错误码)。

例如,下面模块用于生成错误返回值。该模块可以生成一个int型错误码,用来定位错误文件、错误行数以及错误类型。其中,32位 int 中,8位用于表示错误码,14位表示行数,9位表示文件名下标。即,该int型值的使用限制为:

支持255个错误码(0xff为表留值)
支持每个文件16383行(0x3ffff为保留值)
支持511个文件(0x1ff为保留值)
仅针对文件名,而非文件路径名,因此应尽量避免不同目录下出现同名代码文件
超出该限制的情况下,程序并不会发生异常或者报错,而是会报出Unknown ...的错误,

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

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

相关文章

双非本 985 硕士,秋招上岸字节算法岗!

最近已有不少大厂都在秋招宣讲了,也有一些在 Offer 发放阶段。 节前,我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新人如何快速入门算法岗、如何准备面试攻略、面试常考点、大模型项目落地经验分享等热门话题进行了深入的讨论。…

Chainlit集成LlamaIndex实现知识库高级检索(自动合并检索)

检索原理 自动合并检索 自动合并检索原理,和我的上一篇文章的检索方案: 将文本分割成512大小(一般对应段落大小)和128(一般对句子大小不是严格的句子长度)大小两种分别存储到索引库,再用llama_…

架构设计笔记-5-软件工程基础知识

知识要点 按软件过程活动,将软件工具分为软件开发工具、软件维护工具、软件管理和软件支持工具。 软件开发工具:需求分析工具、设计工具、编码与排错工具。 软件维护工具:版本控制工具、文档分析工具、开发信息库工具、逆向工程工具、再工…

快速解决Isaac Sim资源获取不到问题

国内使用Isaac Sim的时候,最常见的问题是加载不了USD或材质资源,这会导致整个Isaac Sim软件卡住或崩溃,以及无法继续开展项目。比如加载realsense或,最新的Isaac Sim 4.2.0 加载一个激光雷达,都要获取相关传感器usd&am…

桶排序和计数排序(非比较排序算法)

桶排序 桶排序是一种基于分配的排序算法,特别适合用来排序均匀分布的数据。它的基本思想是将输入的数据分到有限数量的桶里,然后对每个桶内的数据分别进行排序,最后再将各个桶内的数据合并得到最终的排序结果。(通常用于浮点数,因…

RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案

RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案 🛠️ RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案摘要 📃引言 ✨1. 什么是递归?🔍1.1 递归的基本概念 &#x…

JavaScript可视化示例

JavaScript 可视化是指使用 JavaScript 编程语言来创建和操作图形、图表、动画等视觉元素的过程。以下是一些常见的 JavaScript 可视化库和工具,以及它们的主要特点: 1. D3.js 特点: D3.js(Data-Driven Documents)是一个非常强大…

思维商业篇(4)—产业上下游定

思维商业篇(4)—产业上下游定位(微笑曲线) 产业上下游定位,帮助我们去观察一个企业在产业上下游中处于一个什么样的生态位。 上游 处于产业链开始端,百川东到海,百川的的起始端就是上游,东到海的海就是下游。 处在上游的企业一…

嵌入式系统基础讲解

​ 大家好,我是程序员小羊! 前言: 嵌入式系统是计算机科学与电子工程的交叉领域,广泛应用于消费电子、工业控制、汽车、医疗设备等多个行业。嵌入式系统设计涉及硬件和软件的协同开发,要求开发者掌握多方面的基础知识。…

Python学习——【4.4】数据容器(序列)的切片

文章目录 【4.4】数据容器(序列)的切片一、了解什么是序列二、掌握序列的切片操作 【4.4】数据容器(序列)的切片 一、了解什么是序列 序列是指:内容连续、有序,可使用下标索引的一类数据容器。 列表、元组…

基于单片机的粮仓环境检测系统设计

本设计主要由处理模块、温湿度检测模块、数据显示模块、声光报警模块和按钮的输入模块组成。采用了AT89C52作为主要的控制单元,利用DHT11温湿度传感器,对粮食仓库中的温度和湿度等展开检测,并在LCD1602液晶显示器中进行实时显示。同时&#x…

双向链表:实现、操作与分析【算法 17】

双向链表:实现、操作与分析 引言 双向链表(Doubly Linked List)是链表数据结构的一种重要形式,它允许节点从两个方向进行遍历。与单向链表相比,双向链表中的每个节点不仅包含指向下一个节点的指针(或引用&…

iOS常见锁及应用(笔记版)

什么是锁? 在程序中,当多个任务(或线程)同时访问同一个资源时,比如多个操作同时修改一份数据,可能会导致数据不一致。这时候,我们需要“锁”来确保同一时间只有一个任务能够操作这个数据&#…

django项目——图片上传到阿里云OSS对象存储

文章目录 实现图片上传到阿里云OSS对象存储1. 创建阿里云OSS对象存储2. 查询获取接口访问key和秘钥3. 安装阿里云的SDK集成到项目中使用3.1 python直接操作oss23.2 django配置自定义文件存储上传文件到oss 实现图片上传到阿里云OSS对象存储 1. 创建阿里云OSS对象存储 开发文档…

顶点缓存对象(VBO)与顶点数组对象(VAO)

我们的顶点数组在CPU端的内存里是以数组的形式存在,想要GPU去绘制三角形,那么需要将这些数据传输给GPU。那这些数据在显存端是怎么存储的呢?VBO上场了,它代表GPU上的一段存储空间对象,表现为一个unsigned int类型的变量,GPU端内存对象的一个ID编号、地址、大小。一个VBO对…

Python爬虫之urllib模块详解

Python爬虫入门 此专栏为Python爬虫入门到进阶学习。 话不多说,直接开始吧。 urllib模块 Python中自带的一个基于爬虫的模块,其实这个模块都几乎没什么人用了,我就随便写写了。 - 作用:可以使用代码模拟浏览器发起请求。&…

基于python的文本聚类分析与可视化实现,使用kmeans聚类,手肘法分析

1、数据预处理 由于在数据分析之前数据集通常都存在数据重复、脏数据等问题,所以为了提高 数据分析结果的质量,在应用之前就必须对数据集进行数据预处理。数据预处理的方法通常有清洗、集成、转换、规约这四个方面,接下来详细介绍这对爬取…

leetcode第七题:字符反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 示例 1: 输入…

分布式安装LNMP

目录 搭建LNMP架构 安装mysql 1.上传mysql软件包,关闭防火墙和核心防护 2.安装环境依赖包,桌面安装可能有自带的数据库除 3.配置软件模块 4.编译及安装 5.创建mysql用户 6.修改mysql 配置文件 7.更改mysql安装目录和配置文件的属主属组 8.设置…

认识结构体

目录 一.结构体类型的声明 1.结构的声明 2.定义结构体变量 3.结构体变量初始化 4.结构体的特殊声明 二.结构体对齐(重点难点) 1.结构体对齐规则 2.结构体对齐练习 (一)简单结构体对齐 (二)嵌套结构体对齐 3.为什么存在内存对齐 4.修改默认对齐数 三.结构体传参 1…