JAVA异常处理

简介: 本方案提出两种服务层错误处理策略:方案一用JDK21密封接口统一返回Result类型,显式表达成功/失败语义;方案二保留异常但边界内安全封装,自动映射业务异常为HTTP响应。二者均提升API健壮性与可维护性。(239字)

方案 1:Service 返回 Result,而不是抛业务异常

JDK 21 很适合用 sealed interface 表达结果类型:

public sealed interface Result<T>
        permits Result.Success, Result.NotFound, Result.BadRequest, Result.Failed {
   

    record Success<T>(T data) implements Result<T> {
   }

    record NotFound<T>(String msg) implements Result<T> {
   }

    record BadRequest<T>(String msg) implements Result<T> {
   }

    record Failed<T>(String msg) implements Result<T> {
   }
}

public class Response<T> {
   
    private final int code;
    private final String msg;
    private final T data;

    public Response(int code, String msg, T data) {
   
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public static <T> Response<T> from(Result<T> result) {
   
        return switch (result) {
   
            case Result.Success<T> r ->
                    new Response<>(200, "success", r.data());

            case Result.NotFound<T> r ->
                    new Response<>(404, r.msg(), null);

            case Result.BadRequest<T> r ->
                    new Response<>(400, r.msg(), null);

            case Result.Failed<T> r ->
                    new Response<>(500, r.msg(), null);
        };
    }
}
public Result<Void> doService() {
   
    var entity = repository.findById(id);

    if (entity.isEmpty()) {
   
        return new Result.NotFound<>("resource not found");
    }

    // do something
    return new Result.Success<>(null);
}

public Response<Void> bar() {
   
    return Response.from(service.doService());
}

方案 2:保留异常,但在边界内吞掉“已知业务异常”

如果你们现在 service 已经大量抛 NotFoundException、BizException,短期可以先做一个 wrapper,但只处理业务异常:


@FunctionalInterface
public interface ThrowingSupplier<T> {
   
    T get() throws Exception;
}
public class Response<T> {
   
    private String msg;
    private int code;
    private T data;

    public Response(int code, String msg, T data) {
   
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public static <T> Response<T> ok(ThrowingSupplier<T> supplier) {
   
        try {
   
            T data = supplier.get();
            return new Response<>(200, "success", data);
        } catch (Exception e) {
   
            return handleException(e);
        }
    }

    private static <T> Response<T> handleException(Exception e) {
   
        return switch (e) {
   
            case NotFoundException ex ->
                    new Response<>(404, ex.getMessage(), null);

            case IllegalArgumentException ex ->
                    new Response<>(400, ex.getMessage(), null);

            case NullPointerException ex ->
                    new Response<>(500, "Null pointer error", null);

            default ->
                    new Response<>(500, "Internal server error", null);
        };
    }
}

controller:

public Response<Void> bar() {
   
    return Response.safe(() -> {
   
        service.doService();
    });
}
相关文章
|
3月前
|
JSON 安全 API
openapi swagger skills
本技能专为生成、审查与优化OpenAPI/Swagger文档而设计,遵循API优先原则,支持OpenAPI 3.1(默认)、3.0.x及Swagger 2.0。涵盖路径设计、HTTP语义、参数/响应/安全定义、错误模型、分页、异步任务等18项规范,确保文档准确、一致、可读、工具友好,适用于设计评审、文档生成、契约对齐与测试等场景。(239字)
342 3
|
4月前
|
人工智能 安全 API
深度解析 Claude Code 在 Prompt / Context / Harness 的设计与实践
文章内容基于作者个人技术实践与独立思考,旨在分享经验,仅代表个人观点。
4041 75
深度解析 Claude Code 在 Prompt / Context / Harness 的设计与实践
|
Prometheus 监控 Cloud Native
【监控利器Prometheus】——Prometheus+Grafana监控SpringBoot项目JVM信息
Prometheus+Grafana监控SpringBoot项目JVM信息 1. SpringBoot项目配置JVM采集 2. Prometheus配置 3. 配置grafana 4. 扩展-通过JMX Exporter监控JVM信息
【监控利器Prometheus】——Prometheus+Grafana监控SpringBoot项目JVM信息
|
2月前
|
缓存 弹性计算 应用服务中间件
高端网站搭建:Nginx 反向代理与动静分离架构配置详解
在现代企业级 Web 架构中,Nginx 凭借其极低的内存消耗和超强的高并发处理能力,成为了不可或缺的流量网关。特别是在阿里云 ECS 实例搭配 Alibaba Cloud Linux 3 的环境下,Nginx 能够充分利用操作系统的网络栈优化,实现惊人的吞吐量。 本文将详细介绍如何配置 Nginx 的反向代理与动静分离,将静态资源请求与动态接口请求完美剥离,从而大幅提升网站的整体响应速度。
|
2月前
|
人工智能 运维 供应链
AI转型真正掉队的,不是员工,而是组织
当众人聚焦“员工如何不被AI淘汰”,CXOU AI未来大会直指更深层问题:真正掉队的,是组织本身——僵化的结构、迟滞的决策、割裂的信息与流失的经验。2026年6月12日上海,聚焦组织变革而非技术工具,邀实践者共探AI时代真正的转型路径。
|
2月前
|
存储 安全 Java
【Java基础】集合框架: HashMap核心原理:JDK1.7 vs 1.8+ 区别、数据结构、哈希函数、扩容机制、put/get全流程、红黑树转换阈值(附《思维导图》+《面试高频考点清单》)
本文系统对比JDK1.7与1.8+中HashMap的底层原理,涵盖数据结构(数组+链表→+红黑树)、哈希函数、扩容机制、插入方式及并发问题等核心差异,助你深入理解性能优化逻辑与面试高频考点。
|
2月前
|
人工智能 自然语言处理 数据可视化
企业如何应用智能客服?瓴羊Quick Service用好智能客服系统落地应用策略
本文剖析智能客服“上线即吃灰”困局,提出瓴羊Quick Service四大落地策略:结构化知识构建、人机协同坐席辅助、数据驱动效果评估、组织保障运营机制,助力企业从“可用”迈向“好用”,实现服务数智化升级。(239字)
|
2月前
|
机器学习/深度学习 人工智能 机器人
电话语音 Agent 说话间隔 0.8 秒,听起来真的像真人吗
本文探讨电话语音AI的“真人感”核心指标——说话间隔(Turn-Taking Latency)。分析指出:人类对话平均间隔仅300–400ms,而当前顶尖系统通过流式ASR、LLM加速、流式TTS等技术,已将延迟压至0.8–1.2秒,在预约等结构化场景中用户误判为真人的比例超80%。
361 0
|
2月前
|
缓存 API 调度
DeepSeekFlash 批处理偶发超时,​D​М‌X​Α‌РΙ 调稳记录
DeepSeekFlash因高并发下偶发超时,需工程化调用保障稳定性;DМXΑРΙ提供统一API底座,实现鉴权、重试、上下文裁剪、可观测性等能力,助力deepseek-v4-flash从“可用”迈向“可规模化默认部署”。