全局异常捕获,自定义异常处理类和返回体封装

发布时间:2026/9/3 8:46:45

全局异常捕获,自定义异常处理类和返回体封装
文件结构ExceptionCode.Java 自定义异常码注解package com.example.xxxxx.config.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; Retention(RetentionPolicy.RUNTIME) Target({ElementType.FIELD}) // 表明该注解只能放在类的字段上 public interface ExceptionCode { // 响应码code int value() default 10000; // 响应信息msg String message() default 参数校验错误; }SystemExceptionType.java 系统异常类型枚举package com.example.xxxxxx.config.enums; import com.example.xxxxx.config.exception.ServiceExceptionDefinition; public class SystemExceptionType { public static final ServiceExceptionDefinition SUCCESS new ServiceExceptionDefinition(true, 200, 操作成功); public static final ServiceExceptionDefinition SAVE_SUCCESS new ServiceExceptionDefinition(true, 200, 保存成功); public static final ServiceExceptionDefinition UPDATE_SUCCESS new ServiceExceptionDefinition(true, 200, 编辑成功); public static final ServiceExceptionDefinition DELETE_SUCCESS new ServiceExceptionDefinition(true, 200, 删除成功); public static final ServiceExceptionDefinition ERROR new ServiceExceptionDefinition(false, 9999, 操作异常); public static final ServiceExceptionDefinition SAVE_ERROR new ServiceExceptionDefinition(false, 9999, 保存异常); public static final ServiceExceptionDefinition UPDATE_ERROR new ServiceExceptionDefinition(false, 9999, 编辑异常); public static final ServiceExceptionDefinition DELETE_ERROR new ServiceExceptionDefinition(false, 9999, 删除异常); public static final ServiceExceptionDefinition PARAM_ERROR new ServiceExceptionDefinition(false, 10002, 参数错误); public static final ServiceExceptionDefinition REQUEST_PARAMETER_LACK new ServiceExceptionDefinition(false, 10016, 缺少请求参数); public static final ServiceExceptionDefinition REQUEST_PARAMETER_ANALYSIS new ServiceExceptionDefinition(false, 10017, 参数解析失败); public static final ServiceExceptionDefinition REQUEST_PARAMETER_BIND new ServiceExceptionDefinition(false, 10018, 参数绑定失败); public static final ServiceExceptionDefinition METHOD_NOT_ALLOWED new ServiceExceptionDefinition(false, 10019, 不支持当前请求方法); public static final ServiceExceptionDefinition HTTP_CLIENT_ERROR new ServiceExceptionDefinition(false, 10020, 不支持当前媒体类型); public static final ServiceExceptionDefinition NULL_POINT new ServiceExceptionDefinition(false, 10022, 空指针异常); public static final ServiceExceptionDefinition MISSING_PATH_VARIABLE new ServiceExceptionDefinition(false, 10024, 未检测到路径参数); public static final ServiceExceptionDefinition MISSING_HEAD_VARIABLE new ServiceExceptionDefinition(false, 10026, 未检测到请求头参数); public static final ServiceExceptionDefinition TYPE_MISMATCH new ServiceExceptionDefinition(false, 10025, 参数类型匹配失败); public static final ServiceExceptionDefinition FILE_SIZE_BIG_ERR new ServiceExceptionDefinition(false, 10026, 文件不能超过10M); public static final ServiceExceptionDefinition EXCEL_EXPORT_ERROR new ServiceExceptionDefinition(false, 10101, 导出Excel失败请联系网站管理员); public static final ServiceExceptionDefinition DELETE_ID_NOT_EXIST new ServiceExceptionDefinition(false, 11001, 删除ID不能为空); public static final ServiceExceptionDefinition TOKEN_EXCEPTION new ServiceExceptionDefinition(false, 10086, TOKEN异常); public static final ServiceExceptionDefinition TOKEN_NOT_EXIST new ServiceExceptionDefinition(false, 10085, 缺少TOKEN); public static final ServiceExceptionDefinition TENANTID_EXCEPTION new ServiceExceptionDefinition(false, 10186, 租户异常); public static final ServiceExceptionDefinition TENANTID_NOT_EXIST new ServiceExceptionDefinition(false, 10185, 缺少租户); public static final ServiceExceptionDefinition DEFECT_SYSTEM_CLASSES_CONFIG new ServiceExceptionDefinition(false, 10021, 系统配置缺少值班班次配置); }GlobalExceptionHandler.java 全局异常处理器package com.example.xxxxx.config.exception; import com.example.xxxxx.config.annotation.ExceptionCode; import com.example.xxxxx.config.enums.SystemExceptionType; import com.example.xxxxx.config.vo.R; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.TypeMismatchException; import org.springframework.http.HttpStatus; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.util.StringUtils; import org.springframework.validation.BindException; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.web.HttpMediaTypeNotSupportedException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.MissingPathVariableException; import org.springframework.web.bind.MissingRequestHeaderException; import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.multipart.MaxUploadSizeExceededException; import org.springframework.web.servlet.NoHandlerFoundException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Field; Slf4j RestControllerAdvice public class GlobalExceptionHandler { ExceptionHandler(MethodArgumentNotValidException.class) public R MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) throws NoSuchFieldException { // 从异常对象中拿到错误信息 String defaultMessage e.getBindingResult().getAllErrors().get(0).getDefaultMessage(); // 参数的Class对象等下好通过字段名称获取Field对象 Class? parameterType e.getParameter().getParameterType(); // 拿到错误的字段名称 String fieldName e.getBindingResult().getFieldError().getField(); Field field parameterType.getDeclaredField(fieldName); // 获取Field对象上的自定义注解 ExceptionCode annotation field.getAnnotation(ExceptionCode.class); // 有注解的话就返回注解的响应信息 if (annotation ! null) { return R.error().code(annotation.value()).message(StringUtils.isEmpty(annotation.message()) ? defaultMessage : annotation.message()); } // 没有注解就提取错误提示信息进行返回统一错误码 return R.error().code(SystemExceptionType.PARAM_ERROR.getCode()).message(defaultMessage); } /** * 400 - Bad Request */ ResponseStatus(HttpStatus.BAD_REQUEST) ExceptionHandler(MissingServletRequestParameterException.class) public R handleMissingServletRequestParameterException(MissingServletRequestParameterException e) { log.error(缺少请求参数, e); return R.error().code(SystemExceptionType.REQUEST_PARAMETER_LACK.getCode()) .message(SystemExceptionType.REQUEST_PARAMETER_LACK.getMsg()); } /** * 400 - Bad Request */ ResponseStatus(HttpStatus.BAD_REQUEST) ExceptionHandler(MaxUploadSizeExceededException.class) public R SizeLimitExceededException(HttpServletRequest request, HttpServletResponse response, MaxUploadSizeExceededException e) { log.error(文件上传过大,e); return R.error().code(SystemExceptionType.FILE_SIZE_BIG_ERR.getCode()) .message(SystemExceptionType.FILE_SIZE_BIG_ERR.getMsg()); } /** * 400 - Bad Request */ ResponseStatus(HttpStatus.BAD_REQUEST) ExceptionHandler(HttpMessageNotReadableException.class) public R handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { log.error(参数解析失败, e); return R.error().code(SystemExceptionType.REQUEST_PARAMETER_ANALYSIS.getCode()) .message(SystemExceptionType.REQUEST_PARAMETER_ANALYSIS.getMsg()); } /** * 400 - Bad Request */ ResponseStatus(HttpStatus.BAD_REQUEST) ExceptionHandler(TypeMismatchException.class) public R handleHttpMessageNotReadableException(TypeMismatchException e) { log.error(参数类型匹配失败, e); return R.error().code(SystemExceptionType.TYPE_MISMATCH.getCode()) .message(SystemExceptionType.TYPE_MISMATCH.getMsg()); } /** * 400 - Bad Request */ ResponseStatus(HttpStatus.BAD_REQUEST) ExceptionHandler(BindException.class) public R handleBindException(BindException e) { log.error(参数绑定失败, e); BindingResult result e.getBindingResult(); FieldError error result.getFieldError(); String field error.getField(); String code error.getDefaultMessage(); String message String.format(%s:%s, field, code); return R.error().code(SystemExceptionType.REQUEST_PARAMETER_BIND.getCode()) .message(message); } /** * 404 - Bad Request */ ResponseStatus(HttpStatus.NOT_FOUND) ExceptionHandler(NoHandlerFoundException.class) public R handleBindException(NoHandlerFoundException e) { log.error(查找有没有对应的控制器404, e); return R.error().code(SystemExceptionType.REQUEST_PARAMETER_BIND.getCode()) .message(SystemExceptionType.REQUEST_PARAMETER_BIND.getMsg()); } /** * 405 - Method Not Allowed */ ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) ExceptionHandler(HttpRequestMethodNotSupportedException.class) public R handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { log.error(不支持当前请求方法, e); return R.error().code(SystemExceptionType.METHOD_NOT_ALLOWED.getCode()) .message(SystemExceptionType.METHOD_NOT_ALLOWED.getMsg()); } /** * 415 - Unsupported Media Type */ ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE) ExceptionHandler(MissingPathVariableException.class) public R handleHttpMediaTypeNotSupportedException(MissingPathVariableException e) { log.error(请求路径缺少参数, e); return R.error().code(SystemExceptionType.MISSING_PATH_VARIABLE.getCode()) .message(SystemExceptionType.MISSING_PATH_VARIABLE.getMsg()); } /** * 415 - Unsupported Media Type */ ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE) ExceptionHandler(MissingRequestHeaderException.class) public R handleHttpHeadException(MissingRequestHeaderException e) { log.error(请求头缺少参数, e); return R.error().code(SystemExceptionType.MISSING_HEAD_VARIABLE.getCode()) .message(SystemExceptionType.MISSING_HEAD_VARIABLE.getMsg()); } /** * 415 - Unsupported Media Type */ ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE) ExceptionHandler(HttpMediaTypeNotSupportedException.class) public R handleHttpMediaTypeNotSupportedException(Exception e) { log.error(不支持当前媒体类型, e); return R.error().code(SystemExceptionType.HTTP_CLIENT_ERROR.getCode()) .message(SystemExceptionType.HTTP_CLIENT_ERROR.getMsg()); } /** * -------- 通用异常处理方法 -------- **/ ExceptionHandler(Exception.class) public R error(Exception e) { log.error(未捕捉异常, e); e.printStackTrace(); return R.error().code(500).message(e.getMessage()); // 通用异常结果 } /** * -------- 指定异常处理方法 -------- **/ ExceptionHandler(NullPointerException.class) public R error(NullPointerException e) { e.printStackTrace(); log.error(e.getMessage(),e); return R.setData(SystemExceptionType.NULL_POINT); } ExceptionHandler(HttpClientErrorException.class) public R error(IndexOutOfBoundsException e) { e.printStackTrace(); log.error(e.getMessage(),e); return R.setData(SystemExceptionType.HTTP_CLIENT_ERROR); } /** * -------- 自定义定异常处理方法 -------- **/ ExceptionHandler(ServiceException.class) public R error(ServiceException e) { log.error(e.getMessage(),e); if (e.getMessage().contains(SystemExceptionType.TOKEN_EXCEPTION.getMsg())) { log.error(e.getMessage()); } else { e.getStackTrace(); } return R.error().message(e.getMessage()).code(e.getCode()); } }ServiceException.java 自定义业务异常类package com.example.xxxxx.config.exception; import java.io.Serializable; public class ServiceException extends RuntimeException implements Serializable { private int code; public int getCode() { return code; } public void setCode(int code) { this.code code; } public ServiceException() { } public ServiceException(String message, int code) { super(message); this.code code; } public ServiceException(ServiceExceptionDefinition definition) { super(definition.getMsg()); this.code definition.getCode(); } }ServiceExceptionDefinition.java 异常定义类package com.example.xxxxx.config.exception; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; Data NoArgsConstructor AllArgsConstructor public class ServiceExceptionDefinition { private boolean success; private int code; private String msg; }MsgResult.java 响应格式(未用)package com.example.xxxxx.config.vo; import lombok.Data; Data public class MsgResult { public MsgResult(int _code, String _result, String _msg, Object _data){ this.msg _msg; this.code _code; this.result _result; this.data _data; } /** * 返回状态码301警告0成功500错误 */ private int code; /** * 返回结果success成功error失败 */ private String result; /** * 返回消息 */ private String msg; /** * 返回内容 */ private Object data; }P.java 分页结果封装类package com.example.xxxxx.config.vo; import lombok.Data; import java.io.Serializable; import java.util.ArrayList; import java.util.List; Data public class PT implements Serializable { /** * 总数量 */ private Long total; /** * 数据 */ private ListT rows; public P() { } public P(ListT list, Long total) { this.rows list; this.total total; } public P(Long total) { this.rows new ArrayList(); this.total total; } public static T PT empty() { return new P(0L); } public static T PT empty(Long total) { return new P(total); } }R.java统一响应结果封装类package com.example.xxxxx.config.vo; import com.example.xxxxx.config.enums.SystemExceptionType; import com.example.xxxxx.config.exception.ServiceExceptionDefinition; import lombok.Data; Data public class RT { /** * 成功 */ private Boolean success; /** * 状态码 */ private Integer code; /** * 信息 */ private String message; // /** // * 结果 // */ // private MapString, Object result new HashMap(); /** * 结果 */ private T result; // 构造器私有 private R() { } // 通用返回成功 public static R ok() { R r new R(); r.setSuccess(true); r.setCode(SystemExceptionType.SUCCESS.getCode()); r.setMessage(SystemExceptionType.SUCCESS.getMsg()); return r; } // 通用返回成功 public static R okSave() { R r new R(); r.setSuccess(true); r.setCode(SystemExceptionType.SAVE_SUCCESS.getCode()); r.setMessage(SystemExceptionType.SAVE_SUCCESS.getMsg()); return r; } // 通用返回成功 public static R okUpdate() { R r new R(); r.setSuccess(true); r.setCode(SystemExceptionType.UPDATE_SUCCESS.getCode()); r.setMessage(SystemExceptionType.UPDATE_SUCCESS.getMsg()); return r; } // 通用返回成功 public static R okDelete() { R r new R(); r.setSuccess(true); r.setCode(SystemExceptionType.DELETE_SUCCESS.getCode()); r.setMessage(SystemExceptionType.DELETE_SUCCESS.getMsg()); return r; } // 通用返回失败未知错误 public static R error() { R r new R(); r.setSuccess(false); r.setCode(SystemExceptionType.ERROR.getCode()); r.setMessage(SystemExceptionType.ERROR.getMsg()); return r; } public static R errorSave() { R r new R(); r.setSuccess(false); r.setCode(SystemExceptionType.SAVE_ERROR.getCode()); r.setMessage(SystemExceptionType.SAVE_ERROR.getMsg()); return r; } public static R errorUpdate() { R r new R(); r.setSuccess(false); r.setCode(SystemExceptionType.UPDATE_ERROR.getCode()); r.setMessage(SystemExceptionType.UPDATE_ERROR.getMsg()); return r; } public static R errorDelete() { R r new R(); r.setSuccess(false); r.setCode(SystemExceptionType.DELETE_ERROR.getCode()); r.setMessage(SystemExceptionType.DELETE_ERROR.getMsg()); return r; } // 设置结果形参为结果枚举 public static R setData(ServiceExceptionDefinition result) { R r new R(); r.setSuccess(result.isSuccess()); r.setCode(result.getCode()); r.setMessage(result.getMsg()); return r; } /** * ------------使用链式编程返回类本身----------- **/ // 自定义返回数据 public R result(T model) { this.setResult(model); return this; } // // 自定义返回数据 // public R result(MapString, Object map) { // this.setResult(map); // return this; // } // // // 通用设置data // public R result(String key, Object value) { // this.result.put(key, value); // return this; // } // 自定义状态信息 public R message(String message) { this.setMessage(message); return this; } // 自定义状态码 public R code(Integer code) { this.setCode(code); return this; } // 自定义返回结果 public R success(Boolean success) { this.setSuccess(success); return this; } }结果示例

相关新闻

32面向对象(中级)-多态

32面向对象(中级)-多态

2026/9/3 8:46:45

1.多态的基本介绍 多态 多种状态 同一个方法,对于不同的对象,会做出不同反应(结果),就是多态。 (1) 生活版:什么是多态? ①你有一个宠物喂食器喂食器只认识&#xff…

Resilience4j + Prometheus + Grafana实现熔断服务可视化监控

Resilience4j + Prometheus + Grafana实现熔断服务可视化监控

2026/9/3 8:46:44

springboot2.5后,Hystrix熔断器被官方弃用,同时用于可视化监控的Hystrix Dashboard仪表盘也被弃用,高版本springboot使用Resilience4j Prometheus Grafana替代Hystrix Dashboard仪表盘,实现服务熔断的可视化监控 一、可视化监控…

AI眼镜接入智能手表运动健康数据:Livis OTA升级全解析

AI眼镜接入智能手表运动健康数据:Livis OTA升级全解析

2026/9/3 8:36:44

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

基于SpringBoot的家庭财务管理系统:从设计到部署的完整实战

基于SpringBoot的家庭财务管理系统:从设计到部署的完整实战

2026/9/3 9:46:48

简介:这是一份面向计算机专业本科生的毕业设计级家庭财务管理系统完整交付包,基于SpringBoot框架构建,解决个人或家庭日常收支记录、统计与可视化管理需求,适合作为课程设计、毕设选题及Java全栈开发能力训练项目。压缩包共807个文…

Python实现Markdown/HTML一键粘贴到Word/Excel:PasteMD工具开发全解析

Python实现Markdown/HTML一键粘贴到Word/Excel:PasteMD工具开发全解析

2026/9/3 9:46:48

简介:PasteMD 是一款面向程序员、技术文档撰写者及办公效率追求者的 Python 桌面工具,专为解决 Markdown、网页富文本及 AI 对话内容在 Word/WPS/Excel 中排版失真、粘贴繁琐的痛点而设计。它通过常驻系统托盘一键触发机制,自动识别剪贴板内容…

智能体工程化:从OpenClaw协作到ClickHouse运行数据闭环

智能体工程化:从OpenClaw协作到ClickHouse运行数据闭环

2026/9/3 9:46:48

如果把九月初关于 AI 的几个热点放在一起看,会发现一个相当清晰的信号。OpenClaw 2.0 开始谈协作,AI 应用圈开始认真讨论护城河,ClickHouse 这类数据库也开始在智能体基础设施里被反复提起。表面上看,这三件事互不相干&#xff1a…

基于AdaIN的图像风格迁移:从原理到PyTorch实战

基于AdaIN的图像风格迁移:从原理到PyTorch实战

2026/9/3 9:46:48

简介:本资源是一套基于AdaIN(Adaptive Instance Normalization)实现图像风格迁移的完整机器学习实践项目,面向人工智能与计算机视觉方向的学习者、研究者及深度学习初学者,旨在解决内容图像与风格图像融合生成高质量艺…

深度学习红外与可见光图像融合:PyTorch训练与MATLAB部署实战

深度学习红外与可见光图像融合:PyTorch训练与MATLAB部署实战

2026/9/3 9:46:47

简介:本资源是一个基于MATLAB实现的红外与可见光图像融合深度学习项目,面向人工智能、计算机视觉方向的初学者与进阶研究者,解决多模态图像信息互补融合这一典型任务。压缩包共62个文件,含46张PNG/JPG格式的配对红外(I…

AgentScope 2.0:快速搭建权限可控、沙箱隔离并可扩展多智能体的智能体框架实战指南

AgentScope 2.0:快速搭建权限可控、沙箱隔离并可扩展多智能体的智能体框架实战指南

2026/9/3 9:36:47

AgentScope 2.0:快速搭建权限可控、沙箱隔离并可扩展多智能体的智能体框架实战指南 【免费下载链接】agentscope Build and run agents you can see, understand and trust. 项目地址: https://gitcode.com/GitHub_Trending/ag/agentscope AgentScope 2.0 是…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/9/2 10:08:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/9/2 12:11:52

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/9/1 23:49:08

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

【原创】基于微信小程序+AI大模型+uni-app的宠物用品商城小程序(设计与实现)

【原创】基于微信小程序+AI大模型+uni-app的宠物用品商城小程序(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

【原创】基于AI大模型+SpringBoot+Vue的宠物用品商城(设计与实现)

【原创】基于AI大模型+SpringBoot+Vue的宠物用品商城(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

【原创】基于微信小程序+AI大模型+uni-app的节日礼品定制商城小程序(设计与实现)

【原创】基于微信小程序+AI大模型+uni-app的节日礼品定制商城小程序(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

远程协作的工作台整理

远程协作的工作台整理

2026/9/3 6:56:24

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/3 6:39:45

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/3 5:20:28

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…